docker
1.为什么使用docker
docker使用的是container技术,比如部署rails过程中,最起码是需要服务器和数据库,其中服务器一般用nginx,数据库一般使用mysql,可以nginx使用一个独立容器,而mysql使用一个独立容器,这两个容器相互独立,又可以联通,容器本身是跨平台的,在部署的时候非常方便。
2.相关术语
镜像 image,是一个模板,容器是从镜像中生成的。
容器 container,应用运行在容器中。
仓库 repository:打包好的镜像是放置在仓库中的。
3.安装docker
1.需要提供镜像服务
需要提供镜像加速服务,这个在阿里云的[镜像加速器]这个服务模块中,用户有自己的加速链接(下面的registry-mirrors中的就是阿里云提供的)。这对mac的加速链接的方式是在docker客户端的Settings docker engine中进行修改。
{
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"experimental": false,
"registry-mirrors": [
"https://xx"
]
}
示例:
#拉取镜像
docker pull nginx #也可以是docker pull nginx:latest 最后这个是标签
#列出所有镜像
docker images #也可以是docker image ls
#启动容器
docker run -d --name web -p 8080:80 nginx:latest
#启动容器命令 docker run
#-d 在后台运行
#--name web 定义容器名称为web
# -p 8080:80 定义端口,其中宿主机(就是本地的mac)端口为8080,容器端口为80
#nginx:latest 容器所需要的镜像名称
docker ps #查看启动的容器
docker ps -a #查看所有容器
#进入容器
docker exec -it web /bin/bash #进入容器中,使用bash命令
apt update #更新源,如果没有更新源,那么vim安装不成功
apt install vim -y #安装vim工具,更新/usr/share/nginx/html/index.html文件
#访问这个容器项目
访问链接http://localhost:8080/,修改主页内容/usr/share/nginx/html,修改html文件
#使用容器生成镜像
docker commit web hello-world #web是目前容器的名称,hello-world是生成镜像的名称
#给镜像打tag,也可以理解是生成一份不同名字的拷贝
docker tag hello-world zhengjiajun/hello-world:latest
docker tag hello-world zhengjiajun/one
#将镜像提交到hub中需要将镜像的名称定义为user/name的形式,这也是上面tag的原因
#我的hub用户名称是zhengjiajun,所以将镜像命名为zhengjiajun/name的形式
#登录docker hub需要进行登录 登录和退出的命令分别是
docker login
docker logout
#docker上传到hub中
docker push zhengjiajun/one
使用docker-compose.yml文件
#启动 默认是docker-compose.yml文件,也可以使用自定义名称web.yml
docker-compose -f web.yml up -d
#文件结构,包括四个一级的key
version services networks volumes
version ,对应关系https://www.cnblogs.com/fengfengyang/p/16442146.html
version: 3
services
#services的关键字
image #从官方或者自己的hub中获取镜像
build #从Dockerfile中构建镜像
ports #端口映射(容器内的端口映射到宿主机端口) “8080:80” 左边是宿主机的端口,右边的容器端口
volumes #卷挂载,“dbdata:/var/lib/mysql” 左边是要映射的目录,右边是容器目录
environment #设置环境变量,供容器内应用使用
environment:
MYSQL_ROOT_PASSWORD:admin
depends_on :依赖关系,确保服务的前后启动顺序
command : 容器启动后执行的命令
networks : 网络设置
restart:always 随宿主机启动
networks
#常见驱动类型
bridge(默认模式) overlay host
#格式
drive:host
volumes
1.外部卷,docker外部创建和管理,可以被容器使用,示例是external:true
2.命名卷,有固定名称,在宿主机预定义的目录下面
volumes:
dbdata:
3.匿名卷
4.主机卷,宿主机的文件系统挂载到容器中
/path/in/host:/path/in/container
完整的docker-compose.yml文件
version: '3.8'
services:
db:
container_name: sqldb
image: mariadb
volumes:
- dbdata:/var/lib/mysql
restart: always
environment:
- MYSQL_ROOT_PASSWORD: admin
- MYSQL_DATABASE: jayzen_db
- MYSQL_USER: my_user
- MYSQL_PASSWORD: my_password
networks:
- mynet
phpmyadmin:
image: phpmyadmin
restart: always
ports:
- 8080:80
environment:
-PMA_ARBITRARY: 1
networks:
- mynet
networks:
mynet:
volumes:
dbdata:
使用Dockerfile文件
#保存为文件Dockerfile
FROM ubuntu:latest
MAINTAINER jayzen <jayzen@foxmail.com>
RUN apt update #对镜像执行的命令
CMD ["echo", "hello world"] #镜像构建完成之后对容器执行的命令
#创建镜像, docker build创建镜像命令,-t name, 镜像名称, .当前文件夹下面
docker build -t myubuntu:1.0 .
#运行镜像,输出hello world表示成功运行
docker run b8df944a8864 #b8df944a8864是镜像的id