安装

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh    or   sudo sh get-docker.sh --mirror Aliyun
sudo usermod -aG docker your-user

最好用国内的源,国外的源容易卡,容易安装失败

常用命令

下载镜像,如果不指定版本的话,默认用 latest

sudo docker pull ubuntu:18.04

默认是到 docker 的官方 registry 下载镜像,有可能很慢,可以改变默认配置

创建或修改文件 /etc/docker/daemon.json,添加以下内容

{
  "registry-mirrors": ["https://9cpn8tt6.mirror.aliyuncs.com"]
}

重启服务

systemctl daemon-reload
systemctl restart docker

重新 pull 速度就快了很多

可以在 pull 的时候指定 registry

docker pull URL/ubuntu:18.04

registry 有可能要求先登陆

docker login URL/ubuntu:18.04

查看本地已有的镜像

sudo docker images

删除镜像

sudo docker rmi ubuntu:18.04

启动容器

sudo docker run -i -t ubuntu:18.04 /bin/bash

如果本地没有相应的镜像,会自动到默认 registry pull
/bin/bash 是容器启动后执行的命令,可以是任何命令
-i -t 表示使用交互式终端,配合 /bin/bash 命令相当于是登陆了容器

后台运行 -d

sudo docker run -t -i -d ubuntu:18.04 sleep 10

共用宿主机网络,修改主机名

docker run --network host --hostname docker_test -i -t -d ubuntu:18.04 /bin/bash

查看容器状态

docker ps -a

连上正在运行的容器 (连上容器启动命令的标准输出输入)

docker attach c93b8664bad3

连上正在运行的容器 (启动新命令)

docker exec -t -i c93b8664bad3 /bin/bash

停止和删除容器

docker stop c93b8664bad3 
docker rm c93b8664bad3 

删除所有处于 stop 状态的容器

sudo docker container prune

端口映射

docker run --network host -d -i -t -p 9000:9000 ubuntu:18.04 /bin/bash

设置环境变量

docker run --network host -d -i -t -e "env_1=test_1" -e "env_2=test_2" ubuntu:18.04 /bin/bash

查看标准输出日志

docker logs c93b8664bad3

查看容器信息

docker inspect c93b8664bad3

将正在运行的容器创建成新的镜像

docker commit -m="Docker Test" -a="lin" c93b8664bad3 ubuntu_18_04_test:v1

将创建的镜像推到 registry

docker push ubuntu_18_04_test:v1

导出导入容器

docker export -o [file] [container_id]
docker import [file] [command]

导出导入镜像

docker save -o ubuntu_18_04_test.tar ubuntu_18_04_test:v1
docker load -i ubuntu_18_04_test.tar

通过 Dockerfile 创建镜像

# cat ./Dockerfile
FROM ubuntu_18_04_test:v1

USER root

ENV env_name "test"

COPY flask_test.tar.gz /opt
WORKDIR /opt

RUN tar -xvf flask_test.tar.gz \
    && rm flask_test.tar.gz

WORKDIR /opt/flask_test
RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple/ -r requirements.txt

EXPOSE 8000

CMD gunicorn -c gunicorn_config.py flask_test:app
docker build --network host -t ubuntu_flask_test:v1 ./

有几点注意

  1. ENV 是设置环境变量
  2. 可以用 ADD 取代 COPY,而 ADD 命令除了复制还会同时做解压,甚至可以将 URL 文件下载并解压
  3. 如果用 cd 命令改变目录,这个设置只在当前 RUN 命令有效,要长久有效要用 WORKDIR
  4. 尽量不要写多个 RUN,因为 RUN 命令实际上会增加一层镜像
  5. EXPOSE 本身不会实际起作用,要等到 docker run 指定 -P (注意是大写) 参数时才会映射 EXPOSE 指定的端口
  6. CMD 指定容器的启动命令,如果 docker run 有带启动命令,CMD 指定的命令会被忽略,如果是通过 ENTRYPOINT 指定,那即使 docker run 有带启动命令也无法覆盖

docker-compose

安装

sudo curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version

下载 docker-compose 需要FQ,可以找国内的网站下载,比如 http://get.daocloud.io/

sudo curl -L "https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

官网 https://docs.docker.com/compose/ 的介绍如下

Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration.

就是一个可以配置管理多个容器的工具

先定义一个 docker-compose.yml 文件

version: '2.0'
services:
  web:
    build: .
    ports:
    - "5000:5000"
    volumes:
    - .:/code
    - logvolume01:/var/log
    links:
    - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

这个配置文件定义了两个容器,一个 redis,直接使用现成的镜像,一个 web,通过 dockerfile 生成

通过下面的命令可以依据配置文件启动和停止这两个容器

docker-compose up
docker-compose down

可以通过指定文件启动多个配置

docker-compose -f docker-compose.yml -f docker-compose.prod.yml up

docker-compose 可以做很多配置,看起来有点像 K8S 的 pod