zhangdizhangdi

Docker

文档

安装

  • 腾讯云服务器选择的系统,带docker
  • 阿里云服务器选择的系统,需要自行安装docker和docker-compose

安装docker

bash
$ dnf config-manager --add-repo=https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
$ dnf -y install dnf-plugin-releasever-adapter --repo alinux3-plus
$ dnf -y install docker-ce --nobest

安装docker-compose

bash
$ curl -L "https://github.com/docker/compose/releases/download/v2.2.0/docker-compose-linux-x86_64" -o /usr/local/bin/docker-compose

Docker 常用命令

bash
# 容器
$ docker ps -a
$ docker start <容器名/ID>
$ docker stop <容器名/ID>
$ docker restart <容器名/ID>
$ docker rm -f <容器名/ID>
$ docker container prune  # 清理掉所有处于终止状态的容器
$ docker exec <容器名/ID> # 如果从这个容器退出,容器不会停止
$ docker exec -it <容器名/ID> sh #进入容器执行命令
$ docker attach <容器名/ID> # 如果从这个容器退出,会导致容器的停止
$ docker logs <容器名/ID>
$ docker stats
$ docker container update <容器名/ID> --memory="700m" # 修改正在运行容器的限制

# 镜像
$ docker images
$ docker rmi <镜像名/ID>
$ docker image prune -f # 删除 <none> 镜像

#
$ docker -v
$ systemctl status docker   #查看Docker运行状态
$ systemctl start docker    #运行Docker守护进程
$ systemctl enable docker   #设置Docker开机自启动

Docker Compose

yml
# docker-compose-test.yml
services:
  test-api:
    image: test-api
    container_name: test-api
    build: .
    restart: always
    depends_on:
      - test-mysql
    env_file:
      - .env.test
    ports:
      - '${HOST_APP_PORT}:${APP_PORT}'
    links:
      - test-mysql # 互联

  test-mysql:
    image: mysql:8.0
    container_name: test-mysql
    restart: always
    volumes:
      - /home/data/test-mysql:/var/lib/mysql
    env_file:
      - .env.test
    ports:
      - '${HOST_DB_MYSQL_PORT}:${DB_PORT}'
bash
# .env.test 文件
DB_HOST=test-mysql # 互联的容器

国内镜像地址

遇到问题

阿里云服务器 docker pull超时

您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器

bash
$ mkdir -p /etc/docker # -p 确保目录名称存在,不存在的就建一个。
$ tee /etc/docker/daemon.json <<-'EOF' #  tee命令用于读取标准输入的数据,并将其内容输出成文件。
{
  "registry-mirrors": ["https://yox7rbt6.mirror.aliyuncs.com"]
}
EOF
$ systemctl daemon-reload
$ systemctl restart docker

阿里加速 node 版本太低,docker官网pull不下来,找网上资源自己安装

bash
$ docker pull <网站镜像地>
$ docker tag <旧镜像>:<> <新镜像>:<>
  • 新旧镜像名称指向同一个镜像层(相同 IMAGE ID),实际磁盘空间不会翻倍,类似于文件系统的"硬链接"概念。
  • 可以自由删除其中一个标签,不会影响另一个标签的使用。
  • 通过 IMAGE ID 删除会移除所有关联标签

环境变量问题

在 docker-compose 中可以通过 env_file 定义使用的环境变量,但是此处定义的环境变量是用于 docker 容器内运行的。
无法用于在 docker-compose 文件中替换 image/ports 等内容,如果要定义 docker-compose 中的变量,可以有两种办法:

  1. 使用 .env 文件,不要加任何前后缀
  2. 执行 docker-compose 的时候指定参数 --env-file
yml
docker-compose -f docker-compose.test.yml --env-file .env.test up -d --build test-api

# .env.test文件
HOST_APP_PORT=4000
APP_PORT=4000

# docker-compose.test.yml文件
ports:
  - '${HOST_APP_PORT}:${APP_PORT}'

服务器卡死问题

yml
#docker-compose.test.yml 每个service 增加 limits
image: test-api
container_name: test-api
deploy:
  resources:
    limits:
      cpus: '0.25'
      memory: 100M

# 增加 --compatibility
docker-compose -f docker-compose.test.yml --env-file .env.test --compatibility up

执行问题

  1. 服务器不是用 root 用户登录,执行 docker-compose up,提示权限不够
  2. sudo docker-compose up 提示 sudo: docker-compose:找不到命令
bash
$  whereis docker-compose
docker-compose: /usr/local/bin/docker-compose

# 那么问题就好解决了,直接复制一份过去完事
$  sudo cp -r  /usr/local/bin/docker-compose  /usr/bin/docker-compose