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

B站遇见狂神说UP主视频教学:https://www.bilibili.com/video/BV1og4y1q7M4



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的结果

Search.png

通过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