Docker和虚拟机的不同:

  • 传统虚拟机,虚拟出一套硬件,在硬件之上运行一个完整的操作系统,然后在操作系统上安装和运行软件。
  • 容器内的应用直接运行在宿主机的内核上,容器没有自己的内核,也没有虚拟出硬件。
  • 每个容器之间是相互隔离的,每个容器都有一个属于自己的文件系统,互不影响。

Docker镜像命令

查看镜像

使用方式:

docker images [option] [repository[:TAG]]

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 12 months ago 13.3kB

# 解释


#只显示镜像ID
$ docker images -q
7c3ce33e4a1f
ec3789272a09
698ab9017c5b
19d9cb152dda


字段名 含义
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像ID
CREATED 镜像创建时间
SIZE 镜像的大小
Option选项 描述
–all , -a # 显示所有镜像 (default hides intermediate images)
–digests # Show digests
–filter , -f # Filter output based on conditions provided
–format # Pretty-print images using a Go template
–no-trunc #Don’t truncate output
–quiet , -q # Only show image IDs

搜索镜像

使用方式:

docker search [OPTION] TERM

示例:

1
2
3
4
5
6
7
$ docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10339 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3832 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 757 [OK]
....

1
2
3
4
5
# 搜索时添加过滤条件为STARS不小于3000
$ docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10339 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3832 [OK]

查看某个命令的可选项

使用方式:

docker [命令名称] –help

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ docker images --help

Usage: docker images [OPTIONS] [REPOSITORY[:TAG]]

List images

Options:
-a, --all Show all images (default hides intermediate images)
--digests Show digests
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print images using a Go template
--no-trunc Don't truncate output
-q, --quiet Only show numeric IDs

下载镜像

使用方式:

docker pull [OPTION] NAME[:TAG|@DIGEST]

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
6ec7b7d162b2: Pull complete # 分层下载
fedd960d3481: Pull complete
7ab947313861: Pull complete
64f92f19e638: Pull complete
3e80b17bff96: Pull complete
014e976799f9: Pull complete
59ae84fee1b3: Pull complete
ffe10de703ea: Pull complete
657af6d90c83: Pull complete
98bfb480322c: Pull complete
6aa3859c4789: Pull complete
1ed875d851ef: Pull complete
Digest: sha256:78800e6d3f1b230e35275145e657b82c3fb02a27b2d8e76aac2f5e90c1c30873 # 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址

如果不写TAG,则默认下载最新的镜像。

以下两个命令等价:

1
2
$ docker pull mysql
$ docker pull docker.io/library/mysql:latest

指定版本下载:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ docker pull mysql:5.7
5.7: Pulling from library/mysql
6ec7b7d162b2: Already exists
fedd960d3481: Already exists
7ab947313861: Already exists
64f92f19e638: Already exists
3e80b17bff96: Already exists
014e976799f9: Already exists
59ae84fee1b3: Already exists
7d1da2a18e2e: Pull complete
301a28b700b9: Downloading [============> ] 26.25MB/108.3MB
529dc8dbeaf3: Download complete
bc9d021dc13f: Download complete

删除镜像

使用方式:

docker rmi [OPTIONS] IMAGE [IMAGE…]

示例:

1
2
3
4
5
6
$ docker rmi -f 882aebcdb308
Deleted: sha256:882aebcdb308cd2f1dc333c3fc1676614ea0bd9b4379d0bfdf5db55640e56e56
Deleted: sha256:7da399cc68d63c6d3540bad15369c46e971443bc73981df585a7a37aefd3983a
Deleted: sha256:b480ebcefedc620f17a24d5c61a336361c075db1aaf57e2a1de32b97f69eb3a4
Deleted: sha256:957eb1ae5cf15a8089a9b19aaacbacdaf06fb5045d6fb2bb95c3c37961b09081

删除所有的镜像:

1
$ docker rmi -f $(docker images -aq)

其中$(docker images -aq)为查询所有镜像的ID

Docker容器命令

安装centos进行测试

1
$ docker pull centos

新建容器并运行

docker run [OPTIONS] IMAGE [COMMAND] [ARG…]

示例:

1
2
3
4
$ docker run -it  centos /bin/bash # 运行并进入容器
[root@fbddb27d188f /]# ls # 查看容器内的centos
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@fbddb27d188f /]# exit # 从容器退回主机

查看容器

docker ps [OPTIONS]

示例:

1
2
3
4
5
$ docker ps # 查看当前正在运行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$ docker ps -all # 列出当前运行的容器+查看曾经运行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fbddb27d188f centos "/bin/bash" 14 minutes ago Exited (0) 3 minutes ago happy_kowalevski
Option名称 描述
-all, -a 显示所有容器
–last, -n 显示最近创建的n个容器
–quiet, -q 只显示容器的ID

退出容器

退出并关闭容器

exit

退出但不关闭容器

Ctrl + P + Q

删除容器

使用方式:

docker rm [OPTIONS] CONTAINER [CONTAINER…]

Option选项 描述
--force , -f Force the removal of a running container (uses SIGKILL)
--link , -l Remove the specified link
--volumes , -v Remove anonymous volumes associated with the container

示例:

1
2
$ docker rm fbddb27d188f
fbddb27d188f

启动容器

1
$ docker start [容器ID]

重启容器

1
$ docker restart [容器ID]

停止容器

1
$ docker stop [容器ID]

强制停止当前容器

1
$ docker kill [容器ID]

常用其他命令

后台运行容器

1
2
3
4
5
6
7
8
9
10
11
$ docker run -d centos
f3cc16b38e9dc3e281681f226128b3f084aec79b9d9c27721a83f36189fdaebc

# lize @ lize-linux in ~ [21:15:59]
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

# lize @ lize-linux in ~ [21:16:04]
$ docker ps -all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f3cc16b38e9d centos "/bin/bash" 12 seconds ago Exited (0) 11 seconds ago elegant_archimedes

docker run -d centos中的-d表示后台运行,但是该后台运行必须对应一个前台进程,否则docker会将这个容器停止。

查看日志

1
$ docker logs -tf --tail 10 [容器ID]

-tf表示显示日志, --tail [数字]表示要显示日志条数。

查看容器内部进程

1
$ docker top [容器ID]

示例:

1
2
3
$ docker top 8326642ceb7d        
UID PID PPID C STIME TTY TIME CMD
root 20286 20264 0 21:46 pts/0 00:00:00 /bin/bash

查看容器的元数据

1
$ docker inspect [容器ID]

进入当前正在运行的容器

1
$ docker exec -it [容器ID] bashshell

或者

1
$ docker attach [容器ID]

两者区别:docker exec 在进入容器后开启一个新的终端,docker attach 在进入容器后使用正在执行的一个终端。

将容器内部的文件拷贝到主机上

1
$ docker cp [容器ID]:[容器中的文件路径] [主机文件夹路径]

![](/home/lize/Pictures/Screenshot from 2021-01-05 23-14-52.png)

作业1:docker部署nginx

docker部署nginx并完成端口映射

1
2
$ docker run -d --name nginx01 -p 3344:80 nginx
f358c945ae0eed75160c006a0a3fac73028c9aa73f1ed2b87e6c12d708aa17fe

作业2:docker部署tomcat

官方使用:

1
$ docker run -it --rm tomcat

--rm表示停止容器后将无法查询到该容器,先在本地镜像中寻找tomcat,本地镜像没有则去docker 仓库下载。

后台运行tomcat:

1
$ docker run -d  -p 3355:8080 --name tomcat01 tomcat

但是访问localhost:3355出现404,这是因为tomcat中的webapps目录中没有任何项目。

将webapps.dist中的项目复制到webapps中:

1
root@8be6bf1b1aa5:/usr/local/tomcat# cp -r webapps.dist/* webapps

再次访问localhost:3355则出现tomcat欢迎界面。

Docker可视化界面

portainer是Docker图形化界面管理工具。

1
2
$ docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

访问测试:localhost:8088

Docker镜像讲解

镜像是什么

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

如何得到镜像:

  • 从远程仓库下载
  • 从朋友处拷贝
  • 自己制作一个镜像Dockerfile

Commit命令

将现有容器打包成镜像。

1
2
3
4
5
6
7
$ docker run -it tomcat /bin/bash
root@cdcbb2f5b3aa:/usr/local/tomcat# ls
BUILDING.txt LICENSE README.md RUNNING.txt conf logs temp webapps.dist
CONTRIBUTING.md NOTICE RELEASE-NOTES bin lib native-jni-lib webapps work
root@cdcbb2f5b3aa:/usr/local/tomcat# cd webapps
root@cdcbb2f5b3aa:/usr/local/tomcat/webapps# ls
root@cdcbb2f5b3aa:/usr/local/tomcat/webapps#

docker提供的tomcat镜像中的webapps目录下没有项目。

将webapp.dist目录中的项目复制到webapps目录下:

1
2
3
4
root@cdcbb2f5b3aa:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@cdcbb2f5b3aa:/usr/local/tomcat# cd webapps
root@cdcbb2f5b3aa:/usr/local/tomcat/webapps# ls
ROOT docs examples host-manager manager

将该容器打包成镜像:

使用方式:

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

1
$ docker commit -a="lize" -m="add webapps apps" 53b95fab247a tomcat01:1.0

-a表示作者,-m表示提交的描述信息

使用数据卷

使用方式:

$ docker run -it -v [主机目录]:[容器内目录] 容器 /bin/bash

示例:

1
$ docker run -it -v /home/test:/home centos /bin/bash

实战:

将mysql配置目录和数据目录与主机目录进行双向绑定:

1
2
$ 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
da57dd0c24e10ccec927594c1c5adc83a5ae60207697cd8a2d73ed0a9b777059

-d 后台运行

-p 端口映射

-v 数据卷挂载

-e 环境配置

–name 容器名字

上面这条命令完成了以下操作:

  • 在后台运行mysql
  • 将主机3310端口映射到此容器的3306端口
  • 将主机/home/mysql/conf目录与容器中的etc/mysql/conf.d目录双向绑定
  • 将主机/home/mysql/data目录与容器中的/var/lib/mysql目录双向绑定
  • 配置mysql的密码为123456
  • 容器的名称为mysql01

在主机上使用mysql workbench连接localhost:3310,如果连接成功,这就表示端口映射成功。然后使用mysql workbench创建一个名称为test的数据库,在主机的/home/mysql/data目录查看,发现多出一个test目录,并且数据卷挂载成功!

容器删除后,test目录将依旧存在。