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
sudo yum install -y yum-utilssudo yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repo
安装 Docker 引擎:
sudo yum install docker-ce docker-ce-cli containerd.io
执行完就安装结束了。
启动 Docker
sudo systemctl start docker
执行 helloworld镜像测试
sudo docker run hello-world
docker version 查看版本信息:
docker version
yum 更新软件包索引
[root@iZuf60qrb6oj9jjxqkid2aZ ~]# yum makecache fast已加载插件:fastestmirrorLoading mirror speeds from cached hostfilebase | 3.6 kB 00:00:00docker-ce-stable | 3.5 kB 00:00:00epel | 4.7 kB 00:00:00extras | 2.9 kB 00:00:00updates | 2.9 kB 00:00:00
卸载
卸载旧版本
sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine
完全卸载
卸载 Docker Engine、CLI 和 Containerd 包
sudo yum remove docker-ce docker-ce-cli containerd.io
主机上的映像、容器、卷或自定义配置文件不会自动删除。删除所有镜像、容器和卷:
sudo rm -rf /var/lib/dockersudo rm -rf /var/lib/containerd
使用阿里云镜像加速
阿里云提供 docker 官方的完整镜像,可以配置到本地作为 docker 镜像
需要使用自己的阿里云账号,开通镜像的域名
文档: https://help.aliyun.com/document_detail/60750.html
sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF'{"registry-mirrors": ["https://bncm9nr7.mirror.aliyuncs.com"]}EOFsudo systemctl daemon-reloadsudo systemctl restart docker
常用命令
帮助命令
docker xx --help
镜像命令
docker images 查看本机镜像
docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEhello-world latest feb5d9fea6a5 2 weeks ago 13.3kBREPOSITORY 仓库源-a 列出所有镜像-q 只显示镜像 id
docker search 搜索镜像
docker search mysqlNAME DESCRIPTION STARS OFFICIAL AUTOMATEDmysql MySQL is a widely used, open-source relation… 11533 [OK]mariadb MariaDB Server is a high performing open sou… 4381 [OK]# 可选项 过滤docker search mysql --filter=stars=3000NAME DESCRIPTION STARS OFFICIAL AUTOMATEDmysql MySQL is a widely used, open-source relation… 11533 [OK]mariadb MariaDB Server is a high performing open sou… 4381 [OK]
docker pull 下载镜像
# docker pull 镜像名:tag[root@iZuf60qrb6oj9jjxqkid2aZ ~]# docker pull mysqlUsing default tag: latest # 如果不写tag,默认 latestlatest: Pulling from library/mysqlb380bbd43752: Pull completef23cbf2ecc5d: Pull complete30cfc6c29c0a: Pull completeb38609286cbe: Pull complete8211d9e66cd6: Pull complete2313f9eeca4a: Pull complete7eb487d00da0: Pull completea5d2b117a938: Pull complete1f6cb474cd1c: Pull complete896b3fd2ab07: Pull complete532e67ebb376: Pull complete233c7958b33f: Pull completeDigest: sha256:5d52dc010398db422949f079c76e98f6b62230e5b59c0bf7582409d2c85abacbStatus: Downloaded newer image for mysql:latestdocker.io/library/mysql:latest# 真实地址 等价执行了 docker pull docker.io/library/mysql:latest
再下载一个 mysql:5.7 会发现前几个分层镜像已经不用下载,这就是 docker 分层下载,联合文件系统机制
[root@iZuf60qrb6oj9jjxqkid2aZ ~]# docker pull mysql:5.75.7: Pulling from library/mysqlb380bbd43752: Already existsf23cbf2ecc5d: Already exists30cfc6c29c0a: Already existsb38609286cbe: Already exists8211d9e66cd6: Already exists2313f9eeca4a: Already exists7eb487d00da0: Already existsbb9cc5c700e7: Pull complete88676eb32344: Pull complete8fea0b38a348: Pull complete3dc585bfc693: Pull completeDigest: sha256:b8814059bbd9c80b78fe4b2b0b70cd70fe3772b3c5d8ee1edfa46791db3224f9Status: Downloaded newer image for mysql:5.7docker.io/library/mysql:5.7
docker rmi 删除镜像
可以通过名称或 id 删除
# 删除指定 id 镜像docker rmi 8a8a506ccfdc# 删除多个 id 镜像docker rmi 8a8a506ccfdc 8a8axxx 8a8a506zzz# 删除所有镜像docker rmi -f $(docker images -q)
容器命令
容器层就是在镜像层上加了一个可写层,操作都是在容器层,删除容器不会删除镜像。
打包就是把这一层与镜像层打包成一个镜像。
有了镜像才可以创建容器,先下载一个 centos 镜像
docker pull centos
docker run 新建容器并启动
docker run [..参数]# 可选参数--name="Name" 容器名字-d 后台方式运行,类似nohup-it 使用交互方式运行,进入容器查看内容-p 指定容器的端口 -p 8080:8080-p 主机端口:容器端口 映射主机端口(常用)-p 容器端口 只内部使用,不做主机端口映射容器端口 -p 不做主机端口映射可省略-P 大 P 是随机指定端口# 启动 centos 进入 bashdocker run -it centos /bin/bash# 退出容器exit
列出所有运行中的容器
docker ps# 列出 正在运行 与 曾经运行过的容器docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf24c87f5a7c3 centos "/bin/bash" 2 minutes ago Exited (0) About a minute ago beautiful_swanson915b5493713e centos "-it /bin/bash" 3 minutes ago Created compassionate_dirac9375b848082e feb5d9fea6a5 "/hello" 3 hours ago Exited (0) 3 hours ago stupefied_mcnulty# 列出 最近创建的 n 个容器docker ps -a -n=2# -q 只显示 id# 列出所有容器编号docker ps -aq
退出容器
exit # 退出容器并停止容器Ctrl + shift + p 松 shift+p 再按 shift + q #退出容器不停止
删除容器
# 删除指定容器docker rm [容器 id]# 删除所有容器,加 -f 可以删除运行中的容器docker rm -f $(docker ps -aq)# 或者docker ps -aq | xargs docker rm
启动和停止容器
# 启动docker start [容器 id]# 重启docker restart [容器 id]# 停止运行中的容器docker stop [容器 id]# 强制停止(stop 报错,直接 kill)docker kill [容器 id]
其他常用命令
后台启动容器
# 后台启动docker run -d centos# docker ps 会发现 centos 停止了# 因为 docker 容器使用后台运行,就必须要有一个前台进程,否则 docker 会自动停止# 比如 nginx 启动后,发现自己没有提供服务,就会停止
查看日志
# 显示日志信息 -t 显示时间戳 -f 动态显示新的输出docker logs -tf [容器 id]# centos 里运行不会停止输出的脚本docker run -d centos /bin/sh -c "while true;do echo guodegang; sleep 1;done"# 动态显示 最近10行的日志docker logs -tf --tail 10 1c34e92671a3
查看 docker 内部进程信息
docker top [容器 id]
查看镜像元数据(详细数据)
docker inspect [容器 id]
进入当前正在运行的容器
docker exec -it [容器 id]
# 通常容器以后台方式运行,经常需要进入容器,修改一些配置# /bin/bash 通过哪个命令行进入,-it 交互进入[root@iZuf60qrb6oj9jjxqkid2aZ ~]# docker exec -it 1c34e92671a3 /bin/bash[root@1c34e92671a3 /]# lsbin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var[root@1c34e92671a3 /]# ps -efUID PID PPID C STIME TTY TIME CMDroot 1 0 0 01:49 ? 00:00:00 /bin/sh -c while true;do echo guodegang; sleep 1;doneroot 1162 0 0 02:08 pts/0 00:00:00 /bin/bashroot 1183 1 0 02:08 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1root 1184 1162 0 02:08 pts/0 00:00:00 ps -ef# 进入正在执行的终端docker attach [容器 id]
把容器文件拷贝到主机
docker cp
# docker cp [容器 id]:容器内目录文件 本机目录docker cp 3e0f2638c0fb:/home/test.java /home
commit 镜像
# 提交容器成为一个新的副本# 和 git 类似docker commit -m="提交的描述信息" -a="作者" [容器 id] [目标镜像名]:[tag]
-v容器绑定数据卷
容器中的目录绑定本机数据卷目录后,目录下文件修改对双方都有效
一个数据卷可以被多个容器同时挂载,
一个容器也可以绑定多个数据卷。
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
可以通过 docker volume inspect [卷名] 查看具体挂载路径```shelldocker volume inspect juming[{"CreatedAt": "2021-10-15T16:01:59+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/juming/_data","Name": "juming","Options": null,"Scope": "local"}]
所有 docker 容器内的卷,在没有指定目录的情况下都在 /var/lib/docker/volumes/xxx/_data
ro rw改变读写权限
# 通过 -v 容器内路径:ro/rw 改变读写权限ro readonly 只读rw readwrite 读写# 如果是只读,表名在容器内无法修改挂载文件docker run -d -v juming:/etc/nginx:ro nginx
数据卷容器
数据卷容器 可以被其他容器挂载,从而可以实现 多个容器间数据共享
本质是相互拷贝,只要被挂载的没丢。
# 容器 yyy 从 xxx 继承挂载容器# 此时 xxx 就是被挂载的数据卷容器docker run -it --volumes-from xxx yyy
-e 配置环境变量
例如安装 mysql 直接配置密码
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
基础命令:

创建 image:
根据 Dockerfile 创建 image(推荐):
docker image build [OPTIONS] PATH | URL | -[flags]
根据 container 创建 image:
docker container commit
发布与拉取:
``` docker push alvinyang777/hello # 发布
docker pull alvinyang777/hello # 拉取
- 可以通过 docker 关联 github 的Dockerfile项目, 当 github 项目更新时,自动生成新的 image,这样只更新Dockerfile 就可以- Docker 提供了一个名为 registery 的 image,可以用来构建私有的 docker hub。- 构建完成后可直接 docker push [ip]:[端口]/[image名]<a name="IEgqJ"></a>### 常用容器操作:后台运行 container:
docker run -d —name=xxx xxx
运行日志:
docker logs xxx
删除所有 container:
docker rm $(docker container ls -aq)
删除所有退出的 container:
docker rm $(docker container ls -f “status=exited” -q)
命令执行 docker exec:
进入容器 bash
docker exec -it XXXX /bin/bash
打印运行中容器的 ip 地址
docker exec -it XXXX ip a
限制容器内存:
docker run —memory=200M xxxx
设置 CPU 相对权重:
docker run —cpu-shares=10
<a name="O6l3Z"></a>## 例子:Docker 安装 Mysql要求:挂载 mysql 的配置与数据```shell# -d 后台运行# -p 端口映射# -v 卷挂载# -e 环境配置# --name 容器名字condocker 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
