Docker保姆级教程:从入门到入土
Docker安装教程
Docker官方手册 :https://docs.docker.com/
系统环境
此文章演示的版本为Linux版本,系统为CentOS 7,官方手册明确说明:
若要在CentOS上安装Docker,则需要一个CentOS 7的维护版本。不支持或未测试存档版本。
#系统版本信息
[root@localhost ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
安装之前确保系统没有安装过旧版本的Docker,若有安装执行以下命令卸载旧版本的Docker
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
安装Docker
安装Docker之前,需要设置Docker存储库
#设置存储库需安装yum-utils包
yum install -y yum-utils
#设置存储库 , 默认为官方国外地址!!!,若网络状态不好请自行更换国内源
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
#更新源
yum makecache fast
安装Docker
#安装最新的Docker
yum -y install docker-ce docker-ce-cli containerd.io
启动&运行 Docker
#启动Docker
systemctl start docker
#运行Hello-world镜像来测试是否正确安装了Docker
docker run hello-world
#显示以下信息则正确安装了Docker
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
卸载Docker
#卸载Docker
yum remove docker-ce docker-ce-cli containerd.io
#删除主机上的残余文件(镜像,容器,配置文件等等)
rm -rf /var/lib/docker
配置国内镜像加速
使用国内镜像加速能更快的下载镜像,这里以腾讯云为例,其他运行商请自行找到各自的文档进行配置
#打开 /etc/docker/daemon.json 配置文件(这个文件是本身是不存在的,只是通过vim创建-编辑-保存-生成)
vim /etc/docker/daemon.json
#进入vim的编辑模式,添加一下内容,并保存
{
"registry-mirrors": ["https://mirror.ccs.tencentyun.com"]
}
#重新加载服务配置文件
systemctl daemon-reload
#重启Docker进程
systemctl restart docker
Docker命令笔记
Docker 学习资源
Docker官方命令手册 :https://docs.docker.com/reference/
菜鸟教程命令手册:https://www.runoob.com/docker/docker-command-manual.html
Docker镜像命令
docker images 查看本地镜像
docker images [OPTIONS] [REPOSITORY[:TAG]]
-a 列出本地所有镜像
-q 列出本地所有镜像且只显示IMAGE ID
docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 5 months ago 13.3kB
docker images -a
bf756fb1ae65
docker images hello-world
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 5 months ago 13.3kB
#参数说明
REPOSITORY 镜像的名字
TAG 镜像的标签
IMAGE ID 镜像的ID值
CREATED 镜像的创建时间
SIZE 镜像的大小
docker search 从Docker Hub查找镜像
Docker Hub地址:https://hub.docker.com/
从Docker Hub中搜索mysql的结果
通过docker search搜索mysql的结果
docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used... 9666 [OK]
mariadb MariaDB is a community-devel.. 3517 [OK]
mysql/mysql-server Optimized MySQL Server Docker.. 705 [OK]
centos/mysql-57-... MySQL 5.7 SQL database server 77
#通过--filter筛选结果
docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used... 9666 [OK]
mariadb MariaDB is a community-devel.. 3517 [OK]
#参数说明
NAME 镜像的名字
DESCRIPTION 镜像的描述
STARS 类似于GitHub里面的star,表示点赞,喜欢
OFFICIAL 是否为docker官方发布
AUTOMATED 是否自动搭建
docker pull 从Docker Hub下载镜像
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
-a 拉取所有包含[NAME]的镜像
#默认下载最新版
docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
8559a31e96f4: Pull complete
d51ce1c2e575: Pull complete
c2344adc4858: Pull complete
fcf3ceff18fc: Pull complete
16da0c38dc5b: Pull complete
b905d1797e97: Pull complete
4b50d1c6b05c: Pull complete
c75914a65ca2: Pull complete
1ae8042bdd09: Pull complete
453ac13c00a3: Pull complete
9e680cd72f08: Pull complete
a6b5dc864b6c: Pull complete
Digest: sha256:8b7b328a7ff6de46ef96bcf83af048cb00a1c86282bfca0cb119c84568b4caf6
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
#指定版本下载,版本必须在Docker Hub存在
docker pull mysql:8.0
8.0: Pulling from library/mysql
Digest: sha256:8b7b328a7ff6de46ef96bcf83af048cb00a1c86282bfca0cb119c84568b4caf6
Status: Downloaded newer image for mysql:8.0
docker.io/library/mysql:8.0
#从镜像库拉取所有tag标签名的镜像
docker pull mysql -a
#结果太多了,直接看本地镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 8.0 be0dbf01a0f3 2 weeks ago 541MB
mysql latest be0dbf01a0f3 2 weeks ago 541MB
mysql 5.5 d404d78aa797 13 months ago 205MB
mysql 5.5.62 d404d78aa797 13 months ago 205MB
mysql 5.6.43 bc788a6a2745 15 months ago 256MB
mysql 5.6.42 27e29668a08a 18 months ago 256MB
mysql 5.5.61 d306c8812ec3 20 months ago 205MB
mysql 5.6.41 085b9b6ec8a9 20 months ago 256MB
mysql 5.5.60 2cd7ceff3e53 23 months ago 205MB
mysql 5.6.40 50328380b2b4 23 months ago 256MB
mysql 5.5.59 0da48351c371 2 years ago 205MB
mysql 5.6.39 079344ce5ebd 2 years ago 256MB
...
docker rmi 删除本地镜像
docker rmi [OPTIONS] IMAGE [IMAGE...]
-f 强制删除
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest be0dbf01a0f3 2 weeks ago 541MB
hello-world latest bf756fb1ae65 5 months ago 13.3kB
#卸载本地镜像的mysql
docker rmi -f be0dbf01a0f3
docker rmi -f mysql
#卸载本地所有镜像(一个一个删除)
docker rmi -f mysql hello-world
docker rmi -f be0dbf01a0f3 bf756fb1ae65
#卸载本地所有镜像(通过$()传值删除)
docker rmi -f $(docker images -aq)
Docker容器命令
docker run 新建容器并启动
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
--name="Name" 为容器指定一个名称
-d 后台运行容器,并返回容器id
--it 以交互模式运行容器,为容器分配一个伪输入终端
-p (小写p)指定容器的端口 格式为 -p 8080(宿主机端口):8080(容器端口)
-P (大写p)随机指定端口
-v 挂载目录 格式为 -v /home/user(宿主机目录):/root/user(容器目录)
匿名挂载 -v 容器内路径
具名挂载 -v 卷名:容器内路径
指定路径挂载 -v 宿主机路径:容器内路径
只读 在容器内路径后面加 ":ro"
读写 在容器内路径后面加 ":rw"
-e 环境配置
--volumes-from 从另一个容器当中挂载容器中已经创建好的数据卷
docker run -it --name docker02 --volumes-from docker01 centos
运行容器docker02挂载到容器docker01上,实现更新数据在容器之间共享
#docker容器使用后台运行,就必须要有一个前台进程,否则docker发现没有应用就会停止容器
docker ps 列出正在运行的容器信息
docker ps [OPTIONS]
-a 显示所有容器,包括历史容器
-n=Num 显示最近创建的"n"个容器
-q 显示容器的ID
docker退出容器
exit #终止并退出容器
Ctrl + P + Q #不终止并退出容器
docker rm 删除容器
docker rm [OPTIONS] CONTAINER [CONTAINER...]
-f #强制删除一个运行中的容器
#删除容器
docker rm -f 8c7fefd9e698
#删除所有容器
docker rm -f $(docker ps -aq)
docker ps -a -q | xargs docker rm -f
docker start/stop/restart/kill 启动/停止/重启/杀掉容器
docker start CONTAINER :启动容器
docker stop CONTAINER :停止容器
docker restart CONTAINER :重启容器
docker kill CONTAINER :杀掉容器
docker logs 获取容器的日志
docker logs [OPTIONS] CONTAINER
-f 跟踪日志输出
-t 显示时间戳
--tail Num 列出最新Num调容器日志
Docker top 查看容器中运行的进程信息
docker top [OPTIONS] CONTAINER [ps OPTIONS]
docker inspect 获取容器/镜像的元数据
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
#查看centos的元数据
docker inspect centos
[
{
"Id": "sha256:831691599b88ad6cc2a4abbd0e89661a121aff14cfa289ad840fd3946f274f1f",
"RepoTags": [
"centos:latest"
],
"RepoDigests": [
"centos@sha256:4062bbdd1bb0801b0aa38e0f83dece70fb7a5e9bce223423a68de2d8b784b43b"
],
...
Docker exec 进入已经运行的容器(重新分配终端)
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
--it 以交互模式运行容器,为容器分配一个伪输入终端
#进入正在运行的Centos容器
docker exec -it 336cc1fb92bf /bin/bash
Docker attach 连接到正在运行中的容器
docker attach [OPTIONS] CONTAINER
#进入正在运行的Centos容器
docker attach 336cc1fb92bf
Docker cp 容器与主机之间数据拷贝
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp 336cc1fb92bf:/home/test.txt /
将容器里的/home/test.txt 拷贝到 宿主机的/目录上
Docker commit 从容器创建一个新的镜像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
-m :提交时的说明文字;
-a :提交的镜像作者;
创建一个镜像
docker commit -a="MokYan" -m="add webapps app" c97729657a71 tomcat-v1:1.0
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat-v1 1.0 366d86150b16 19 seconds ago 652MB
tomcat latest 6055d4d564e1 3 days ago 647MB
Docker 数据命令
docker volume 管理docker容器挂载的卷
Usage: docker volume COMMAND
Commands:
create 创建一个 volume
inspect 查看一个或多个volume 的元数据
ls 查看 volumes
prune 删除所有未使用的本地 volumes
rm 移出一个或多个 volumes
- docker 默认在主机上会有一个特定的区域(
/var/lib/docker/volumes/
),该区域用来存放 volume。 - 非 docker 进程不应该去修改该区域。
- volume 可以通过
docker volume
进行管理,如创建、删除等操作。 - volume 在生成的时候如果不指定名称,便会随机生成。
docker file
使用 Dockerfile 定制镜像
1. 创建Docker file文件(名字随意)
vim dockerfile1
2. 编辑docker file文件
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
3. 构建镜像
docker build -f /home/docker-test-volume/dockerfile1 -t mokyan/centos:1.0 .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 831691599b88
Step 2/4 : VOLUME ["volume01","volume02"]
---> Running in 7aa721724f47
Removing intermediate container 7aa721724f47
---> 37cc8ddeb5ef
Step 3/4 : CMD echo "----end----"
---> Running in a00fd1594c00
Removing intermediate container a00fd1594c00
---> 976fefd5e341
Step 4/4 : CMD /bin/bash
---> Running in 3203befb485f
Removing intermediate container 3203befb485f
---> e03ef3a4bf68
Successfully built e03ef3a4bf68
Successfully tagged mokyan/centos:1.0
4. 查看镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mokyan/centos 1.0 e03ef3a4bf68 16 seconds ago 215MB
注意:
编辑docker file文件,里面的命令都是大写的
构建镜像时,最后的点是上下文路径,所以上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。
构建镜像时,-t后面接的名字不能存在大写,否则会报错
构建镜像时,"#"表示注释
docker file 指令
FROM #基础镜像,基于这个镜像构建
MAINTAINER #构建镜像的作者信息
RUN #镜像构建时需要运行的命令
ADD #添加内容
WORKDIR #镜像的工作目录
VOLUME #挂载的目录
EXPOSE #暴露端口配置
CMD #容器启动时需要运行的命令,只有最后一个生效,可被替换
ENTRYPOINT #容器启动时需要运行的命令,可以追加命令
ENV #构建的时候设置环境变量
Docker 网络命令
docker network
docker network --help
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
#查看docker 网络适配器模式
docker network ls
NETWORK ID NAME DRIVER SCOPE
8c61b8c764f6 bridge bridge local
0fb588f08568 host host local
58d6ff1f424f none null local
bridge 桥接模式
host 共享宿主机网络模式
none 不配置网络
#创建docker 网络适配器 test-net
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 test-net
--driver 网络适配器模式,默认为bridge
--subnet 子网掩码配置
--gateway 网关配置
#删除docker 网络适配器 test-net
docker network rm test-net
#为容器添加网络适配器,tomcat01_birdge的网络适配器为默认docker01
docker network connect test-net tomcat01_birdge
Docker 其他命令
docker info 显示 Docker 系统信息,包括镜像和容器数
docker version 显示 Docker 版本信息
docker stats 显示Docker容器占用系统资源情况
docker login 登录Docker
docker login -u "你的用户名" -p "你的密码"
docker logout 退出Docker
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!