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

  1. 进入工程目录,创建 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 \
  1. 构建镜像 :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

配置镜像源

  1. 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
  2. windows

    // 在任务栏托盘 Docker 图标内右键菜单选择 Settings,打开配置窗口后在左侧导航菜单选择 Docker Engine,在右侧像下边一样编辑 json 文件,之后点击 Apply & Restart 保存后 Docker 就会重启并应用配置的镜像地址了
    {
      "registry-mirrors": [
        "https://hub-mirror.c.163.com",
        "https://mirror.baidubce.com"
      ]
    }
  3. macos

在任务栏点击 Docker Desktop 应用图标 -> Perferences,在左侧导航菜单选择 Docker Engine,在右侧像下边一样编辑 json 文件。修改完成之后,点击 Apply & Restart 按钮,Docker 就会重启并应用配置的镜像地址了。

检查加速器是否生效 docker info , 如果从结果中看到了如下内容,说明配置成功

Registry Mirrors:
 https://hub-mirror.c.163.com/

其他注意事项

  • 按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者 绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。