Docker有两个版本:

  • 社区版(CE)
  • 企业版(EE)

安装 DockerCE

直接看官网最好, 非常全面:
https://docs.docker.com/install/linux/docker-ce/ubuntu/
这里使用 Centos7系统

安装

设置存储库:
这里可以使用阿里云镜像:
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

  1. sudo yum install -y yum-utils
  2. sudo yum-config-manager \
  3. --add-repo \
  4. https://download.docker.com/linux/centos/docker-ce.repo

安装 Docker 引擎:

  1. sudo yum install docker-ce docker-ce-cli containerd.io

执行完就安装结束了。
启动 Docker

  1. sudo systemctl start docker

执行 helloworld镜像测试

  1. sudo docker run hello-world

docker version 查看版本信息:

  1. docker version

yum 更新软件包索引

  1. [root@iZuf60qrb6oj9jjxqkid2aZ ~]# yum makecache fast
  2. 已加载插件:fastestmirror
  3. Loading mirror speeds from cached hostfile
  4. base | 3.6 kB 00:00:00
  5. docker-ce-stable | 3.5 kB 00:00:00
  6. epel | 4.7 kB 00:00:00
  7. extras | 2.9 kB 00:00:00
  8. updates | 2.9 kB 00:00:00

卸载

卸载旧版本

  1. sudo yum remove docker \
  2. docker-client \
  3. docker-client-latest \
  4. docker-common \
  5. docker-latest \
  6. docker-latest-logrotate \
  7. docker-logrotate \
  8. docker-engine

完全卸载
卸载 Docker Engine、CLI 和 Containerd 包

  1. sudo yum remove docker-ce docker-ce-cli containerd.io

主机上的映像、容器、卷或自定义配置文件不会自动删除。删除所有镜像、容器和卷:

  1. sudo rm -rf /var/lib/docker
  2. sudo rm -rf /var/lib/containerd

使用阿里云镜像加速

阿里云提供 docker 官方的完整镜像,可以配置到本地作为 docker 镜像
需要使用自己的阿里云账号,开通镜像的域名

文档: https://help.aliyun.com/document_detail/60750.html
image.png

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

常用命令

帮助命令

  1. docker xx --help

镜像命令

docker images 查看本机镜像

  1. docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. hello-world latest feb5d9fea6a5 2 weeks ago 13.3kB
  4. REPOSITORY 仓库源
  5. -a 列出所有镜像
  6. -q 只显示镜像 id

docker search 搜索镜像

  1. docker search mysql
  2. NAME DESCRIPTION STARS OFFICIAL AUTOMATED
  3. mysql MySQL is a widely used, open-source relation… 11533 [OK]
  4. mariadb MariaDB Server is a high performing open sou… 4381 [OK]
  5. # 可选项 过滤
  6. docker search mysql --filter=stars=3000
  7. NAME DESCRIPTION STARS OFFICIAL AUTOMATED
  8. mysql MySQL is a widely used, open-source relation… 11533 [OK]
  9. mariadb MariaDB Server is a high performing open sou… 4381 [OK]

docker pull 下载镜像

  1. # docker pull 镜像名:tag
  2. [root@iZuf60qrb6oj9jjxqkid2aZ ~]# docker pull mysql
  3. Using default tag: latest # 如果不写tag,默认 latest
  4. latest: Pulling from library/mysql
  5. b380bbd43752: Pull complete
  6. f23cbf2ecc5d: Pull complete
  7. 30cfc6c29c0a: Pull complete
  8. b38609286cbe: Pull complete
  9. 8211d9e66cd6: Pull complete
  10. 2313f9eeca4a: Pull complete
  11. 7eb487d00da0: Pull complete
  12. a5d2b117a938: Pull complete
  13. 1f6cb474cd1c: Pull complete
  14. 896b3fd2ab07: Pull complete
  15. 532e67ebb376: Pull complete
  16. 233c7958b33f: Pull complete
  17. Digest: sha256:5d52dc010398db422949f079c76e98f6b62230e5b59c0bf7582409d2c85abacb
  18. Status: Downloaded newer image for mysql:latest
  19. docker.io/library/mysql:latest
  20. # 真实地址 等价执行了 docker pull docker.io/library/mysql:latest

再下载一个 mysql:5.7 会发现前几个分层镜像已经不用下载,这就是 docker 分层下载,联合文件系统机制

  1. [root@iZuf60qrb6oj9jjxqkid2aZ ~]# docker pull mysql:5.7
  2. 5.7: Pulling from library/mysql
  3. b380bbd43752: Already exists
  4. f23cbf2ecc5d: Already exists
  5. 30cfc6c29c0a: Already exists
  6. b38609286cbe: Already exists
  7. 8211d9e66cd6: Already exists
  8. 2313f9eeca4a: Already exists
  9. 7eb487d00da0: Already exists
  10. bb9cc5c700e7: Pull complete
  11. 88676eb32344: Pull complete
  12. 8fea0b38a348: Pull complete
  13. 3dc585bfc693: Pull complete
  14. Digest: sha256:b8814059bbd9c80b78fe4b2b0b70cd70fe3772b3c5d8ee1edfa46791db3224f9
  15. Status: Downloaded newer image for mysql:5.7
  16. docker.io/library/mysql:5.7

docker rmi 删除镜像
可以通过名称或 id 删除

  1. # 删除指定 id 镜像
  2. docker rmi 8a8a506ccfdc
  3. # 删除多个 id 镜像
  4. docker rmi 8a8a506ccfdc 8a8axxx 8a8a506zzz
  5. # 删除所有镜像
  6. docker rmi -f $(docker images -q)

容器命令

容器层就是在镜像层上加了一个可写层,操作都是在容器层,删除容器不会删除镜像。
打包就是把这一层与镜像层打包成一个镜像。
有了镜像才可以创建容器,先下载一个 centos 镜像

  1. docker pull centos

docker run 新建容器并启动

  1. docker run [..参数]
  2. # 可选参数
  3. --name="Name" 容器名字
  4. -d 后台方式运行,类似nohup
  5. -it 使用交互方式运行,进入容器查看内容
  6. -p 指定容器的端口 -p 8080:8080
  7. -p 主机端口:容器端口 映射主机端口(常用)
  8. -p 容器端口 只内部使用,不做主机端口映射
  9. 容器端口 -p 不做主机端口映射可省略
  10. -P P 是随机指定端口
  11. # 启动 centos 进入 bash
  12. docker run -it centos /bin/bash
  13. # 退出容器
  14. exit

列出所有运行中的容器

  1. docker ps
  2. # 列出 正在运行 与 曾经运行过的容器
  3. docker ps -a
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. f24c87f5a7c3 centos "/bin/bash" 2 minutes ago Exited (0) About a minute ago beautiful_swanson
  6. 915b5493713e centos "-it /bin/bash" 3 minutes ago Created compassionate_dirac
  7. 9375b848082e feb5d9fea6a5 "/hello" 3 hours ago Exited (0) 3 hours ago stupefied_mcnulty
  8. # 列出 最近创建的 n 个容器
  9. docker ps -a -n=2
  10. # -q 只显示 id
  11. # 列出所有容器编号
  12. docker ps -aq

退出容器

  1. exit # 退出容器并停止容器
  2. Ctrl + shift + p shift+p 再按 shift + q #退出容器不停止

删除容器

  1. # 删除指定容器
  2. docker rm [容器 id]
  3. # 删除所有容器,加 -f 可以删除运行中的容器
  4. docker rm -f $(docker ps -aq)
  5. # 或者
  6. docker ps -aq | xargs docker rm

启动和停止容器

  1. # 启动
  2. docker start [容器 id]
  3. # 重启
  4. docker restart [容器 id]
  5. # 停止运行中的容器
  6. docker stop [容器 id]
  7. # 强制停止(stop 报错,直接 kill)
  8. docker kill [容器 id]

其他常用命令

后台启动容器

  1. # 后台启动
  2. docker run -d centos
  3. # docker ps 会发现 centos 停止了
  4. # 因为 docker 容器使用后台运行,就必须要有一个前台进程,否则 docker 会自动停止
  5. # 比如 nginx 启动后,发现自己没有提供服务,就会停止

查看日志

  1. # 显示日志信息 -t 显示时间戳 -f 动态显示新的输出
  2. docker logs -tf [容器 id]
  3. # centos 里运行不会停止输出的脚本
  4. docker run -d centos /bin/sh -c "while true;do echo guodegang; sleep 1;done"
  5. # 动态显示 最近10行的日志
  6. docker logs -tf --tail 10 1c34e92671a3

查看 docker 内部进程信息

  1. docker top [容器 id]

查看镜像元数据(详细数据)

  1. docker inspect [容器 id]

进入当前正在运行的容器
docker exec -it [容器 id]

  1. # 通常容器以后台方式运行,经常需要进入容器,修改一些配置
  2. # /bin/bash 通过哪个命令行进入,-it 交互进入
  3. [root@iZuf60qrb6oj9jjxqkid2aZ ~]# docker exec -it 1c34e92671a3 /bin/bash
  4. [root@1c34e92671a3 /]# ls
  5. bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
  6. [root@1c34e92671a3 /]# ps -ef
  7. UID PID PPID C STIME TTY TIME CMD
  8. root 1 0 0 01:49 ? 00:00:00 /bin/sh -c while true;do echo guodegang; sleep 1;done
  9. root 1162 0 0 02:08 pts/0 00:00:00 /bin/bash
  10. root 1183 1 0 02:08 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
  11. root 1184 1162 0 02:08 pts/0 00:00:00 ps -ef
  12. # 进入正在执行的终端
  13. docker attach [容器 id]

把容器文件拷贝到主机
docker cp

  1. # docker cp [容器 id]:容器内目录文件 本机目录
  2. docker cp 3e0f2638c0fb:/home/test.java /home

commit 镜像

  1. # 提交容器成为一个新的副本
  2. # 和 git 类似
  3. docker commit -m="提交的描述信息" -a="作者" [容器 id] [目标镜像名]:[tag]

-v容器绑定数据卷

容器中的目录绑定本机数据卷目录后,目录下文件修改对双方都有效
一个数据卷可以被多个容器同时挂载,
一个容器也可以绑定多个数据卷。

  1. docker run ... -v 宿主机目录(文件):容器内目录(文件) ...
  • 目录必须是绝对路径。
  • 如果目录不存在,则会自动创建。
  • 可以挂载多个数据卷。

    具名和匿名挂载

    如果 -v 只有容器内路径,没有宿主机路径,就是匿名挂载 ```shell

    匿名挂载

    docker run -d -v /etc/nginx nginx

    查看挂载信息,这里匿名挂载的 volume name 是乱码

    docker volume ls DRIVER VOLUME NAME local 83281917f5fe4248554938286e76b084e3fe0dc1a60f2be33c1ada0b7df7c5ca

具名挂载, 这里的 juming 不是路径,不是/juming。相当于有了 volume name

docker run -d -v juming:/etc/nginx nginx

docker volume ls DRIVER VOLUME NAME local 83281917f5fe4248554938286e76b084e3fe0dc1a60f2be33c1ada0b7df7c5ca local juming

  1. 可以通过 docker volume inspect [卷名] 查看具体挂载路径
  2. ```shell
  3. docker volume inspect juming
  4. [
  5. {
  6. "CreatedAt": "2021-10-15T16:01:59+08:00",
  7. "Driver": "local",
  8. "Labels": null,
  9. "Mountpoint": "/var/lib/docker/volumes/juming/_data",
  10. "Name": "juming",
  11. "Options": null,
  12. "Scope": "local"
  13. }
  14. ]

所有 docker 容器内的卷,在没有指定目录的情况下都在 /var/lib/docker/volumes/xxx/_data

ro rw改变读写权限

  1. # 通过 -v 容器内路径:ro/rw 改变读写权限
  2. ro readonly 只读
  3. rw readwrite 读写
  4. # 如果是只读,表名在容器内无法修改挂载文件
  5. docker run -d -v juming:/etc/nginx:ro nginx

数据卷容器

数据卷容器 可以被其他容器挂载,从而可以实现 多个容器间数据共享
本质是相互拷贝,只要被挂载的没丢。

  1. # 容器 yyy 从 xxx 继承挂载容器
  2. # 此时 xxx 就是被挂载的数据卷容器
  3. docker run -it --volumes-from xxx yyy

-e 配置环境变量

例如安装 mysql 直接配置密码

  1. docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

基础命令:

docker命令.png

创建 image:

  • 根据 Dockerfile 创建 image(推荐):

    1. docker image build [OPTIONS] PATH | URL | -[flags]
  • 根据 container 创建 image:

    1. docker container commit

    发布与拉取:

    ``` docker push alvinyang777/hello # 发布

docker pull alvinyang777/hello # 拉取

  1. - 可以通过 docker 关联 github Dockerfile项目, github 项目更新时,自动生成新的 image,这样只更新Dockerfile 就可以
  2. - Docker 提供了一个名为 registery image,可以用来构建私有的 docker hub
  3. - 构建完成后可直接 docker push [ip]:[端口]/[image名]
  4. <a name="IEgqJ"></a>
  5. ### 常用容器操作:
  6. 后台运行 container

docker run -d —name=xxx xxx

  1. 运行日志:

docker logs xxx

  1. 删除所有 container

docker rm $(docker container ls -aq)

  1. 删除所有退出的 container

docker rm $(docker container ls -f “status=exited” -q)

  1. 命令执行 docker exec:

进入容器 bash

docker exec -it XXXX /bin/bash

打印运行中容器的 ip 地址

docker exec -it XXXX ip a

  1. 限制容器内存:

docker run —memory=200M xxxx

  1. 设置 CPU 相对权重:

docker run —cpu-shares=10

  1. <a name="O6l3Z"></a>
  2. ## 例子:Docker 安装 Mysql
  3. 要求:挂载 mysql 的配置与数据
  4. ```shell
  5. # -d 后台运行
  6. # -p 端口映射
  7. # -v 卷挂载
  8. # -e 环境配置
  9. # --name 容器名字con
  10. docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name=mysql01 mysql:5.7