安装

https://docs.docker.com/engine/install/debian/
使用国内仓库

  1. sudo add-apt-repository \
  2. "deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian \
  3. $(lsb_release -cs) \
  4. stable"

阿里云镜像加速

  1. sudo mkdir -p /etc/docker
  2. sudo tee /etc/docker/daemon.json <<-'EOF'
  3. {
  4. "registry-mirrors": ["https://XXXX.mirror.aliyuncs.com"]
  5. }
  6. EOF
  7. sudo systemctl daemon-reload
  8. sudo systemctl restart docker

软件安装

  • mysql

    1. docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql
  • redis

    1. docker run -d --name redis -p 6379:6379 redis
  • nacos

    1. docker run -d --name nacos -p 8848:8848 -e MODE=standalone nacos/nacos-server

    docker run

    1. docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
  • -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;

  • -d: 后台运行容器,并返回容器ID;
  • -i: 以交互模式运行容器,通常与 -t 同时使用;
  • -P: 随机端口映射,容器内部端口随机映射到主机的高端口
  • -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
  • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  • —name=”nginx-lb”: 为容器指定一个名称;
  • —dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
  • —dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
  • -h “mars”: 指定容器的hostname;
  • -e username=”ritchie”: 设置环境变量;
  • —env-file=[]: 从指定文件读入环境变量;
  • —cpuset=”0-2” or —cpuset=”0,1,2”: 绑定容器到指定CPU运行;
  • -m :设置容器使用内存最大值;
  • —net=”bridge”: 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
  • —link=[]: 添加链接到另一个容器;
  • —expose=[]: 开放一个端口或一组端口;
  • —volume , -v: 绑定一个卷

    镜像管理

  • 删除本地所有镜像

    1. docker rmi -f $(docker images -q)
  • 清理所有临时镜像

    1. docker rmi $(docker images -q -f dangling=true)
  • 备份所有镜像列表

    1. docker images|awk 'NR>1{print$1":"$2}'|sort > images.list
  • 查看镜像内的环境变量

    1. docker run <imageID> env

    导出

    一般是 import 与 export 搭配,save 和 load搭配

  • save

load 方式加载的镜像,没有丢失镜像的历史,可以回滚到之前的层。
使用 docker-compose.yml 编排的多个镜像组合,但我们要部署的客户服务器并不能连外网。这时就可以使用 docker save 将用到的镜像打个包,然后拷贝到客户服务器上使用 docker load 载入

  1. [root@iZwz9hpx33v77we05l6sypZ ipmi_exporter]# docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. prom/ipmi-exporter v1.1.0 d83643e9ea2b 4 minutes ago 87.6MB
  4. quay.io/prometheus/golang-builder 1.13-base 3ba220caa866 7 days ago 868MB
  5. fjudith/draw.io latest 76508470bc97 8 days ago 673MB
  6. ubuntu 18.04 ccc6e87d482b 5 weeks ago 64.2MB
  7. [root@iZwz9hpx33v77we05l6sypZ ipmi_exporter]# docker save d836 > ipmi.tar
  8. [root@iZwz9hpx33v77we05l6sypZ ipmi_exporter]# ls
  9. collector.go CONTRIBUTING.md Dockerfile go.sum ipmi_remote.yml LICENSE Makefile README.md
  10. config.go docker-compose.yml go.mod ipmi_local.yml ipmi.tar main.go Makefile.common vendor
  • export

export 导出得镜像要小于 save 导出的镜像,但不支持将多个镜像打包成一个文件,(import)导入时会丢失镜像所有的历史记录和元数据信息(即仅保存容器当时的快照状态),所以无法进行回滚操作,适合用于制作基础镜像。

  1. docker export f299f501774c > ims.tar
  • docker export 的应用场景:主要用来制作基础镜像,比如我们从一个 ubuntu 镜像启动一个容器,然后安装一些软件和进行一些设置后,使用 docker export 保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。
  • docker save 的应用场景:如果我们的应用是使用 docker-compose.yml 编排的多个镜像组合,但我们要部署的客户服务器并不能连外网。这时就可以使用 docker save 将用到的镜像打个包,然后拷贝到客户服务器上使用 docker load 载入。

    导入

  • import

可以为镜像指定名称

  1. docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
  1. [root@control01 ~]# docker import - prom/ipmi-exporter:v1.1.0 < ipmi.tar
  2. sha256:bd6b506a72d8aa00d0614074f85b28320cdd67a128000c05cc9a0b9d884144a0
  3. [root@control01 ~]# docker images
  4. REPOSITORY TAG IMAGE ID CREATED SIZE
  5. prom/ipmi-exporter v1.1.0 bd6b506a72d8 4 seconds ago 90.1MB
  • load
    1. docker load < hangge_server.tar

    重命名

    1. docker tag IMAGEID REPOSITORY:TAG
    重命名后会有多余的一个镜像
    1. ~ docker images
    2. REPOSITORY TAG IMAGE ID CREATED SIZE
    3. mysql 5.7.28 1e4405fe1ea9 3 weeks ago 437MB
    4. mysql mysql5.7.28 1e4405fe1ea9 3 weeks ago 437MB
    5. blue-wizard blue-wizard 1afeede877b3 8 weeks ago 2.35GB
    6. blue-wizard-1.0.1-dev003 latest 1afeede877b3 8 weeks ago 2.35GB
  1. 对于不同REPOSITORY,不同TAG的镜像可以直接原有的,并不会删除镜像
  1. docker rmi REPOSITORY:TAG
  1. 对于相同REPOSITORY,不同TAG的镜像,采用第一种方式必须加-f参数才可删除
  1. ~ docker rmi mysql:5.7.28
  2. Untagged: mysql:5.7.28
  3. ~ docker rmi mysql:mysql5.7.28
  4. Error response from daemon: conflict: unable to remove repository reference "mysql:mysql5.7.28" (must force) - container ba0c051a7292 is using its referenced image 1e4405fe1ea9
  5. ~ docker rmi -f mysql:mysql5.7.28
  6. Untagged: mysql:mysql5.7.28
  7. Untagged: mysql@sha256:5779c71a4730da36f013a23a437b5831198e68e634575f487d37a0639470e3a8
  8. ~ docker images
  9. REPOSITORY TAG IMAGE ID CREATED SIZE
  10. <none> <none> 1e4405fe1ea9 3 weeks ago 437MB

此时再次重命名即可

  1. ~ docker tag 1e4405fe1ea9 mysql:5.7.28
  2. ~ docker images
  3. REPOSITORY TAG IMAGE ID CREATED SIZE
  4. mysql 5.7.28 1e4405fe1ea9 3 weeks ago 437MB

容器管理

  • 显示所有的容器,过滤出Exited状态的容器,取出这些容器的ID

    1. docker ps -a|grep Exited|awk '{print $1}'

    批量删除

    1. docker rm `docker ps -a|grep Exited|awk '{print $1}'`

    批量启动

    1. docker start `docker ps -a|grep Exited|awk '{print $1}'`
  • 重命名容器

    1. docker rename my_container my_new_container
  • 复制

    1. docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
    2. docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH
  • 容器日志

    1. docker logs [OPTIONS] CONTAINER

    网络管理

    构建镜像过程中的网络

  • 对于拉取Dockerhub上的镜像,可以采用各大服务商提供的镜像加速器

  • 对于采用Dockerfile,自行build构建的镜像,遇到网络问题,但宿主机网络正常,可以依赖宿主机网络

    1. docker build --network=host -t xx:xx .

    运行容器过程中的网络

    使用宿主机网络

    1. docker run -net=host

    一张图总结

    image.png

    问题

  • 容器无法使用vim, yum等

修改Dockerfile,添加要安装的依赖是不可行的,这与dockerfile定义的os有关

  1. RUN yum install -y vim
  • 容器进入不了bash

试试 sh

  • Docker 容器与宿主机时区不一样

容器创建时加入时区挂载选项: -v /etc/localtime:/etc/localtime

Reference

  1. https://www.runoob.com/docker/docker-run-command.html
  2. https://docs.docker.com/engine/reference/commandline/
  3. https://docs.docker.com/engine/reference/commandline/logs/
  4. https://larrylu.blog/using-volumn-to-persist-data-in-container-a3640cc92ce4
  5. 镜像得import、export、save、load
  6. 解决Docker容器时区不一致的问题

    推荐阅读