Docker
1. Docker结构
与虚拟机相比,Docker利用的是宿主机的内核,把可复用的底层抽离出来,像是堆积木一样,在基础之上独立的创建Docker容器,且互不干扰
2. Docker的基本概念
2.1. 镜像(image)
资源文件,可以理解为安装包文件。
可以通过docker hub查询所需镜像,在服务器上通过以下命令进行拉取
docker pull "资源":"指定版本号"
# 查询镜像文件也可以在docker命令行中查询,例如查询mysql
docker search mysql
# 结果
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 12028 [OK]
mariadb MariaDB Server is a high performing open sou… 4607 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 900 [OK]
percona Percona Server is a fork of the MySQL relati… 568 [OK]
phpmyadmin phpMyAdmin - A web interface for MySQL and M… 435 [OK]
mysql/mysql-cluster Experimental MySQL Cluster Docker images. Cr… 92
centos/mysql-57-centos7 MySQL 5.7 SQL database server 92
centurylink/mysql Image containing mysql. Optimized to be link… 59 [OK]
databack/mysql-backup Back up mysql databases to... anywhere! 54
prom/mysqld-exporter 46 [OK]
deitch/mysql-backup REPLACED! Please use http://hub.docker.com/r… 40 [OK]
tutum/mysql Base docker image to run a MySQL database se… 35
linuxserver/mysql A Mysql container, brought to you by LinuxSe… 35
schickling/mysql-backup-s3 Backup MySQL to S3 (supports periodic backup… 31 [OK]
mysql/mysql-router MySQL Router provides transparent routing be… 23
centos/mysql-56-centos7 MySQL 5.6 SQL database server 21
arey/mysql-client Run a MySQL client from a docker container 20 [OK]
fradelg/mysql-cron-backup MySQL/MariaDB database backup using cron tas… 18 [OK]
genschsa/mysql-employees MySQL Employee Sample Database 9 [OK]
openshift/mysql-55-centos7 DEPRECATED: A Centos7 based MySQL v5.5 image… 6
devilbox/mysql Retagged MySQL, MariaDB and PerconaDB offici… 3
ansibleplaybookbundle/mysql-apb An APB which deploys RHSCL MySQL 3 [OK]
jelastic/mysql An image of the MySQL database server mainta… 2
centos/mysql-80-centos7 MySQL 8.0 SQL database server 2
widdpim/mysql-client Dockerized MySQL Client (5.7) including Curl… 1 [OK]
镜像的拉取也是像堆积木一样分层拉取的
# 如果拉取的时候不指定版本号,就默认拉取latest,也就是最新版本
[root@VM-20-13-centos dockerFile]# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
6552179c3509: Downloading [========================> ] 13.09MB/27.15MB
d69aa66e4482: Download complete
3b19465b002b: Download complete
7b0d0cfe99a1: Download complete
9ccd5a5c8987: Download complete
2dab00d7d232: Download complete
64d3afdccd4a: Download complete
82148d50b16c: Download complete
8bb7d73a7d0c: Download complete
74778cd68a75: Download complete
d7e5f9309140: Download complete
f2e376ecd59f: Download complete
这里能看到mysql的下载是分成许多层级的,很多镜像的底层是能复用的,在拉取有相同底层的镜像时,只会下载服务器上还没有的层级。
结构如下:
在镜像拉取下来后,可以查看该镜像的启动步骤
# 查看镜像
[root@VM-20-13-centos dockerFile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest d1dc36cf8d9e 30 hours ago 519MB
这里可以看到拉取的mysql的镜像id
# 查看镜像启动步骤
[root@VM-20-13-centos dockerFile]# docker history d1dc36cf8d9e
IMAGE CREATED CREATED BY SIZE COMMENT
d1dc36cf8d9e 30 hours ago /bin/sh -c #(nop) CMD ["mysqld"] 0B
<missing> 30 hours ago /bin/sh -c #(nop) EXPOSE 3306 33060 0B
<missing> 30 hours ago /bin/sh -c #(nop) ENTRYPOINT ["docker-entry… 0B
<missing> 30 hours ago /bin/sh -c ln -s usr/local/bin/docker-entryp… 34B
<missing> 30 hours ago /bin/sh -c #(nop) COPY file:c112ec3a02a7b818… 13.2kB
<missing> 30 hours ago /bin/sh -c #(nop) COPY dir:2e040acc386ebd23b… 1.12kB
<missing> 30 hours ago /bin/sh -c #(nop) VOLUME [/var/lib/mysql] 0B
<missing> 30 hours ago /bin/sh -c { echo mysql-community-server m… 384MB
<missing> 30 hours ago /bin/sh -c echo 'deb http://repo.mysql.com/a… 55B
<missing> 30 hours ago /bin/sh -c #(nop) ENV MYSQL_VERSION=8.0.28-… 0B
<missing> 30 hours ago /bin/sh -c #(nop) ENV MYSQL_MAJOR=8.0 0B
<missing> 30 hours ago /bin/sh -c set -ex; key='859BE8D7C586F53843… 2.29kB
<missing> 30 hours ago /bin/sh -c apt-get update && apt-get install… 52.2MB
<missing> 30 hours ago /bin/sh -c mkdir /docker-entrypoint-initdb.d 0B
<missing> 30 hours ago /bin/sh -c set -eux; savedAptMark="$(apt-ma… 4.06MB
<missing> 30 hours ago /bin/sh -c #(nop) ENV GOSU_VERSION=1.14 0B
<missing> 30 hours ago /bin/sh -c apt-get update && apt-get install… 9.34MB
<missing> 30 hours ago /bin/sh -c groupadd -r mysql && useradd -r -… 329kB
<missing> 2 days ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 2 days ago /bin/sh -c #(nop) ADD file:c51141702f568a28a… 69.3MB
镜像的查看命令
docker images "镜像id"
# 指令
-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 image IDs
镜像删除命令
docker rmi "镜像id"
# 遍历删除所有镜像
docker rmi $(docker images -aq)
2.2. 容器(container)
通过镜像可以创建容器,如果不知道指令可以后接–help查看详细的指令帮助
# 查看镜像id
[root@VM-20-13-centos dockerFile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest d1dc36cf8d9e 30 hours ago 519MB
# 通过镜像id来创建容器
[root@VM-20-13-centos ~]# docker run -it -d -p 3310:3306 -v /home/mysql/data:/var/lib/mysql -v /home/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root --name mysql01 mysql /bin/bash
ced783bcb3903dad9d87ba23559202383a4e8a28ef598c523321e1cc799a1805
# 指令解释
run # 创建容器
-it # 交互式
-d # 挂在后台
-p # 端口映射,"宿主机端口":"容器端口"
-v # "宿主机目录":"容器目录",把容器目录挂载到宿主机目录
-e # 环境变量
--name # 重命名
# 查看容器
[root@VM-20-13-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
052af6f48f63 mysql "docker-entrypoint.s…" 6 seconds ago Up 5 seconds 33060/tcp, 0.0.0.0:3310->3306/tcp, :::3310->3306/tcp mysql01
注意,交互式的时候需要指定/bin/bash,否则会因为检测不到引用而自动停止容器
容器的查看命令
docker ps [指令]
-a, --all Show all containers (default shows just running)
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print containers using a Go template
-n, --last int Show n last created containers (includes all states) (default -1)
-l, --latest Show the latest created container (includes all states)
--no-trunc Don't truncate output
-q, --quiet Only display container IDs
-s, --size Display total file sizes
容器的删除命令
[root@VM-20-13-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
052af6f48f63 mysql "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 33060/tcp, 0.0.0.0:3310->3306/tcp, :::3310->3306/tcp mysql01
[root@VM-20-13-centos ~]# docker rm -f 052af6f48f63
052af6f48f63
3. 容器挂载
因为容器是与宿主机分离开来的不同环境,所以如果我们要查看容器内数据文件得进入容器内部,那能不能在宿主机就看到容器内部的数据文件?这就引出了挂载的概念。
把容器内的数据文件目录挂载到宿主机的某个目录上,就能实现我们的需要。
挂载分为具名挂载和匿名挂载
- 具名挂载:是对容器挂载出来的目录进行指定和命名,如果没有创建宿主机的目录,那进行挂载的时候将会自动进行创建
- 匿名挂载:不指定宿主机目录,则会进行随机分配
挂载时也能指定ro:只读,rw:只写
刚刚在创建mysql容器时使用了指令“-v /home/mysql/data:/var/lib/mysql -v /home/mysql/conf:/etc/mysql/conf.d”,这就是一种具名挂载,把数据库中的/var/lib/mysql挂载到宿主机的/home/mysql/data上
这时我们进入容器
进入容器可以使用attach指令或exec指令
[root@VM-20-13-centos ~]# docker exec -it f61777d622a7 /bin/bash
root@f61777d622a7:/#
查看容器内
查看宿主机
可以看到这两个环境的内容同步,此时就算容器关闭,在宿主机上更新,容器再启动时也会保持环境的同步
那么匿名挂载呢
我们可以重新启动一个容器,不指定宿主机目录
# 通过docker inspect可以查看容器的元数据,这时我们可以看看里面的mounts,也就是挂载
[root@VM-20-13-centos ~]# docker run -d -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql02 mysql
49b07b06cacd946ac62d2f5655ea3f5513c9762dedafd2338062316f1410ed76
[root@VM-20-13-centos ~]# docker inspect 49b07b06cacd946ac62d2f5655ea3f5513c9762dedafd2338062316f1410ed76
[
"Mounts": [
{
"Type": "volume",
"Name": "96a7585aede4fd5870c84a9acdba0d8596123433385775a0e55b07236b89b2e2",
"Source": "/var/lib/docker/volumes/96a7585aede4fd5870c84a9acdba0d8596123433385775a0e55b07236b89b2e2/_data",
"Destination": "/etc/mysql/conf.d",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "d3959a74b3863d1a253eef685d9cfb5edae72fa27bce2b6009d2ceac2f511f14",
"Source": "/var/lib/docker/volumes/d3959a74b3863d1a253eef685d9cfb5edae72fa27bce2b6009d2ceac2f511f14/_data",
"Destination": "/var/lib/mysql",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
]
可以看到Destination就是容器数据目录,Source就是匿名挂载在宿主机上的目录,默认会存放在"/var/lib/docker/volumes/xxx/_data"下
4. DockerFile
镜像不止能够从docker hub拉取,也能由我们自己制作DockerFile来生成
因为docker hub拉取的镜像,每个层级都只存有最小保证运行的东西
像我们拉取的centos,没有vim命令,也没有ifconfig命令等等,就是个精简版的centos,这样肯定不能满足我们的需求,那此时我们就可以通过自己编写dockerFile来自定义要的镜像
创建一个文件,我这里随便命名为dockerFile01
# dockerFile01 内容
FROM centos
MAINTAINER Ray<Ray@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "----end----"
CMD "/bin/bash"
# 解释
# dockerFile的命令要大写
# FROM 基本镜像
# MAINTAINER 作者信息
# ENV 环境变量
# WORKDIR 默认工作目录
# RUN 执行的操作
# ADD 添加的其他资源,可以添加压缩包,压缩包将会自动解压,一般解压在/usr/local/目录下
# EXPOSE 暴露的端口
# CMD 当容器启动后,使用cmd命令做点什么,是不可追加命令的,如果在容器启动的时候追加命令,可能会覆盖CMD的命令
# ENTRYPOINT 可追加的CMD
创建镜像
[root@VM-20-13-centos dockerFile]# docker build -f dockerFile01 -t raydockerfile:1.0 .
Sending build context to Docker daemon 2.048kB
Step 1/10 : FROM centos
---> 5d0da3dc9764
Step 2/10 : MAINTAINER Ray<Ray@qq.com>
---> Running in 4d39e00b98eb
Removing intermediate container 4d39e00b98eb
---> b32e0b9c06c7
Step 3/10 : ENV MYPATH /usr/local
---> Running in 958494464f74
Removing intermediate container 958494464f74
---> f7a0a74dbab0
Step 4/10 : WORKDIR $MYPATH
---> Running in bf90c1aee237
Removing intermediate container bf90c1aee237
---> 3485e72a1a1e
Step 5/10 : RUN yum -y install vim
---> Running in a49a51a4fa5a
CentOS Linux 8 - AppStream 8.9 MB/s | 8.4 MB 00:00
# 解释
# -f 指定dockerFile文件名
# -t 指定创建出来的镜像名
此时查看镜像,就会有我们创建的镜像了
[root@VM-20-13-centos dockerFile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
raydockerfile 1.0 e9e873baead7 2 minutes ago 326MB
mysql latest d1dc36cf8d9e 33 hours ago 519MB
centos latest 5d0da3dc9764 4 months ago 231MB
5. 镜像上传
我们自己创建的镜像也能上传,前提是需要有docker hub的账户
[root@VM-20-13-centos dockerFile]# docker login --help
Usage: docker login [OPTIONS] [SERVER]
Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.
Options:
-p, --password string Password
--password-stdin Take the password from stdin
-u, --username string Username
登录后
[root@VM-20-13-centos dockerFile]# docker push raydockerfile:1.0
The push refers to repository [docker.io/library/raydockerfile]
10f82b83df02: Preparing
433df634a1ed: Preparing
74ddd0ec08fa: Preparing
denied: requested access to the resource is denied
# 提交失败,需要先对镜像进行改名,把前缀改成账户昵称/镜像名就可以了
# 我的账户昵称是uprayup
[root@VM-20-13-centos dockerFile]# docker tag e9e873baead7 uprayup/raydockerfile:1.0
[root@VM-20-13-centos dockerFile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
raydockerfile 1.0 e9e873baead7 9 minutes ago 326MB
uprayup/raydockerfile 1.0 e9e873baead7 9 minutes ago 326MB
mysql latest d1dc36cf8d9e 33 hours ago 519MB
centos latest 5d0da3dc9764 4 months ago 231MB
[root@VM-20-13-centos dockerFile]# docker push uprayup/raydockerfile:1.0
The push refers to repository [docker.io/uprayup/raydockerfile]
10f82b83df02: Pushed
433df634a1ed: Pushed
74ddd0ec08fa: Pushed
1.0: digest: sha256:76fe432b8e9041317324826b545bfef87c9613ebf1fd298a49dbdd273699975c size: 953
这样在docker hub就能看到自己制作的镜像文件了