Docker
安装
MacOs、Windows 在官网下载客户端安装即可。
镜像
相当于关机状态的虚拟机模版,或理解为类(class);
容器是一个正在运行的镜像实例;单个镜像可以启动多个容器;
docker 分为 client 和 server;
docker 命令
docker info # 查看 docker 信息
docker login # 登录
service docker status # linux 中查看 docker 运行状态
docker cp conId:src local_src # 拷贝文件
docker cp local_src conId:src
docker search [username/包名] # 搜索包名
docker 镜像命令
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
docker pull ubuntu # 拉取一个镜像
docker images # 查看镜像列表
docker rmi ubuntu # 删除指定镜像
# docker commit [-m custom_msg] <容器ID或容器名> [<仓库名>[:<标签>]] # 保存改动生成新的 image , 慎用 docker commit!!!
docker build -t img_name:tag . # 根据当前目录 Dockerfile 进行构建
docker image prune # 删除虚幻镜像 <none>
docker history [image_name] # 查看镜像内的提交记录
docker save [image_name] | gzip > path/file.tar.gz # 导出镜像并用 gzip 压缩
docker load < path/file.tar.gz # 导入 gzip 压缩的镜像
docker 容器命令
docker ps -a # 列出所有容器
docker run -it --name my_name ubuntu /bin/bash # 实例化一个 Ubuntu 容器,并运行 Bash Shell 作为其应用
docker run -d -p 3000:3000 --name iconify_api iconify/api # 实例化一个 iconify/api 容器,在后台运行,映射 3000 端口
# -it 进入应用
# -d 后台运行
# -p 8081:8080 将 Docker 容器的 8080 端口映射到 宿主机 8081 端口
# --name 命名
# --restart=always 自动重启
# -v 路径映射 -v $PWD/src:con_src 当前目录的 src 映射到容器的 con_src 目录
# --volumes-from my_container ubuntu 把 my_container 挂载到新的容器中
# --rm 推出之后删除容器
docker exec -it my_nginx /bin/bash # 进入交互式命令
docker exit # 退出容器
docker kill [conId] == docker stop [conId]
docker start [conId]
docker rm [conId]
docker rename [conId] [newName]
docker restart [conId]
docker logs [conId] # 查看某个容器的日志
docker port [conId] # 查看某个容器的端口映射
docker-file
1. 获取应用代码
2. 设置 Dockerfile 文件
3. docker build
什么是 dockerfile?
从刚才的 docker commit 的学习中,我们可以了解到,镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。
Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
创建一个 dockerfile
- 进入工程目录,创建
Dockerfile
文件,内容为:
FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
-
FROM 指定基础镜像,Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。FROM scratch 是虚拟的概念,并不实际存在,它表示一个空白的镜像。
-
RUN 执行命令。Dockerfile 支持 Shell 类的行尾添加 \ 的命令换行方式,以及行首 # 进行注释的格式。
- RUN <命令>
- RUN [“可执行文件”, “参数1”, “参数2”]
-
每一个 RUN 的行为,都会 commit 这一层的修改,新建立一层。所以 Dockerfile 正确的写法应该是这样:
RUN set -x; buildDeps='gcc libc6-dev make wget' \
&& apt-get update \
&& apt-get install -y $buildDeps \
- 构建镜像 :
docker build -t nginx:v3 .
- . 表示当前目录,镜像构建上下文,不是指定 Dockerfile 所在路径
编写 dockerfile 命令介绍
- COPY 复制文件:
COPY [--chown=<user>:<group>] <源路径> <目标路径>
, 如果源路径为文件夹,复制的时候不是直接复制该文件夹,而是将文件夹中的内容复制到目标路径 - CMD 容器启动命令:
CMD <命令>
- ENV 设置环境变量:
ENV <key> <value>
或ENV <key1>=<value1> <key2>=<value2>
,例如:ENV NODE_VERSION 7.2.0
, 使用$NODE_VERSION
- VOLUME 定义匿名卷: 事先指定某些目录挂载为匿名卷,这样在运行时如果用户不指定挂载,其应用也可以正常运行,任何向 /data 中写入的信息都不会记录进容器存储层。
VOLUME /data
- EXPOSE 暴露端口:
EXPOSE <端口1> [<端口2>]
。 -p,是映射宿主端口和容器端口,而 EXPOSE 仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射。 - WORKDIR 指定工作目录:
WORKDIR /app
docker-compose
ubuntu 安装 docker-compose
# ubuntu 安装
# 下载最新版的docker-compose文件
# 添加可执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 测试安装结果
docker-compose --version
# 执行 docker-compose.yml 文件 使用.yml或.yaml扩展名均可
docker-compose up -d
docker-compose down # 停止运行的容器,清除容器
docker-compose stop # 停止运行的容器,但是不会删除
docker-compose restart # 改动代码和配置文件等使用,改动了 docker-compose.yml 里的内容,则必须 down 之后再 up
docker-compose.yml 示例
version: '3'
services:
iconify-api:
container_name: iconify-api
image: wudandong/iconify-api-offline
restart: always
ports:
- 3000:3000
environment:
- REDIRECT_INDEX=http://192.168.2.4:3001/
iconify-search:
container_name: iconify-search
image: wudandong/iconify-search
restart: always
ports:
- 3001:80
volumes:
- ./iconify-search.config.js:/usr/share/nginx/html/config.js
version: '3'
services:
nginx:
container_name: nginx
image: nginx:latest
restart: always
ports:
- 80:80
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf
- ./dist:/dist
配置镜像源
-
ubuntu
systemctl cat docker | grep '\-\-registry\-mirror' # 查看是否在 docker.service 文件中配置过镜像地址 systemctl cat docker # 如果该命令有输出,那么查看 ExecStart= 出现的位置,修改对应的文件内容去掉 --registry-mirror 参数及其值
// 在 /etc/docker/daemon.json 中写入如下内容 { "registry-mirrors": [ "https://hub-mirror.c.163.com", "https://mirror.baidubce.com" ] }
# 之后重新启动服务 sudo systemctl daemon-reload sudo systemctl restart docker
-
windows
// 在任务栏托盘 Docker 图标内右键菜单选择 Settings,打开配置窗口后在左侧导航菜单选择 Docker Engine,在右侧像下边一样编辑 json 文件,之后点击 Apply & Restart 保存后 Docker 就会重启并应用配置的镜像地址了 { "registry-mirrors": [ "https://hub-mirror.c.163.com", "https://mirror.baidubce.com" ] }
-
macos
在任务栏点击 Docker Desktop 应用图标 -> Perferences,在左侧导航菜单选择 Docker Engine,在右侧像下边一样编辑 json 文件。修改完成之后,点击 Apply & Restart 按钮,Docker 就会重启并应用配置的镜像地址了。
检查加速器是否生效
docker info
, 如果从结果中看到了如下内容,说明配置成功
Registry Mirrors:
https://hub-mirror.c.163.com/
其他注意事项
- 按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者 绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。