目录
Docker安装
Centos7上安装Docker
# yum install -y yum-utils
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# yum install docker-ce -y
# systemctl start docker
测试安装是否成功
# docker run hello-world
执行上条命令后显示如下,表示安装成功
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 bashShare images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/
Docker离线安装
步骤1 准备一台能够上外网,且最小化安装的centos7服务器。
步骤2 配置Docker yum源配置文件。
步骤3 使用downloadonly和downloaddir选项只下载Docker及其依赖包到本地目录。
# yum install --downloadonly --downloaddir=/docker_rpm docker-ce createrepo -y
# ls /docker_rpm
audit-libs-python-2.8.1-3.el7.x86_64.rpm libsemanage-python-2.5-11.el7.x86_64.rpm
checkpolicy-2.5-6.el7.x86_64.rpm libtool-ltdl-2.4.2-22.el7_3.x86_64.rpm
container-selinux-2.55-1.el7.noarch.rpm pigz-2.3.3-1.el7.centos.x86_64.rpm
createrepo-0.9.9-28.el7.noarch.rpm policycoreutils-python-2.5-22.el7.x86_64.rpm
deltarpm-3.6-3.el7.x86_64.rpm python-deltarpm-3.6-3.el7.x86_64.rpm
docker-ce-18.03.1.ce-1.el7.centos.x86_64.rpm python-IPy-0.75-6.el7.noarch.rpm
libcgroup-0.41-15.el7.x86_64.rpm setools-libs-3.3.8-2.el7.x86_64.rpm
libseccomp-2.3.1-3.el7.x86_64.rpm
步骤4 将docker的rpm包拷贝到需要安装docker的内网服务器上,如 /docker_loacl_yum/目录下
步骤5 移动并备份/etc/yum.repos.d/目录下的配置文件,再创建docker.repo。
# vi /etc/yum.repos.d/docker.repo
[docker]
name=docker
baseurl=file:///docker_local_yum
enable=1
gpgcheck=0
步骤6 安装createrepo,然后创建软件仓库清单数据文件。
# rpm -ivh deltarpm-3.6-3.el7.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:deltarpm-3.6-3.el7 ################################# [100%]
# rpm -ivh python-deltarpm-3.6-3.el7.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:python-deltarpm-3.6-3.el7 ################################# [100%]
# rpm -ivh createrepo-0.9.9-28.el7.noarch.rpm
Preparing... ################################# [100%]
Updating / installing...
1:createrepo-0.9.9-28.el7 ################################# [100%]
# createrepo /docker_local_yum/
Spawning worker 0 with 8 pkgs
Spawning worker 1 with 7 pkgs
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete
步骤7 离线安装Docker
# yum clean all
Loaded plugins: fastestmirror
Cleaning repos: docker
Cleaning up everything
Maybe you want: rm -rf /var/cache/yum, to also free up space taken by orphaned data from disabled or removed repos
Cleaning up list of fastest mirrors
# yum makecache
Loaded plugins: fastestmirror
Determining fastest mirrors
docker | 2.9 kB 00:00:00
(1/3): docker/filelists_db | 6.5 kB 00:00:00
(2/3): docker/other_db | 11 kB 00:00:00
(3/3): docker/primary_db | 12 kB 00:00:00
Metadata Cache Created
# yum install docker-ce -y
# systemctl start docker
# docker version 安装完成
Client:
Version: 18.03.1-ce
API version: 1.37
Go version: go1.9.5
Git commit: 9ee9f40
Built: Thu Apr 26 07:20:16 2018
OS/Arch: linux/amd64
Experimental: false
Orchestrator: swarm
Server:
Engine:
Version: 18.03.1-ce
API version: 1.37 (minimum version 1.12)
Go version: go1.9.5
Git commit: 9ee9f40
Built: Thu Apr 26 07:23:58 2018
OS/Arch: linux/amd64
Experimental: false
卸载Docker
# yum remove docker-ce -y
# rm -rf /var/lib/docker
Docker容器管理
创建容器
容器创建流程:
docker create 创建容器,容器处于停止状态
# docker create centos
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
469cfcc7a4b3: Pull complete
Digest: sha256:989b936d56b1ace20ddf855a301741e52abca38286382cba7f44443210e96d16
Status: Downloaded newer image for centos:latest
176a263e7b834fd585cf35828401f121b89c434581bd9475d0609d093660216e
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
176a263e7b83 centos "/bin/bash" 14 minutes ago Exited (0) 3 minutes ago sad_bardeen
解释:
176a263e…是容器的ID,每一个容器拥有独一无二的标识。
docker ps -a 查看所有容器,包含未启动的容器
docker run 创建容器,容器处于运行状态
交互型容器
进入容器shell环境,在容器中使用exit命令或者其它终端使用docker stop、docker kill,容器会变成停止状态。
[root@docker ~]# docker run -i -t --name=inspect_shell centos /bin/bash
[root@5d7a8ac72a16 /]#
解释:
-i选项:打开容器标准输入
-t选项:建立命令行终端
- -name选项:为容器指定名称,没有该选项时docker会随机取名
centos:为centos镜像创建容器
/bin/bash:在容器里执行/bin/bash
后台型容器
容器创建启动后,运行在后台,使用docker stop或docker kill来停止容器
# docker run --name daemon_while -d centos /bin/bash -c "while true;do echo hello;sleep 1; done"
c0f22db41e5b4ab9b393c9e206e454b6e83b0623e227346aeb4e1765b15a679c
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c0f22db41e5b centos "/bin/bash -c 'while…" 50 seconds ago Up 48 seconds daemon_while
解释:
-d选项:后台守护模式
依附容器
docker attach将终端依附到docker start或docker restart启动的交互式容器上,使其可以继续交互式操作。
[root@docker ~]# docker run -i -t --name attach_test centos /bin/bash
[root@788479b2649d /]# exit
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
788479b2649d centos "/bin/bash" 34 seconds ago Exited (0) 7 seconds ago attach_test
[root@docker ~]# docker start attach_test
attach_test
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
788479b2649d centos "/bin/bash" About a minute ago Up 13 seconds attach_test
[root@docker ~]# docker attach attach_test
[root@788479b2649d /]#
查看容器
docker ps查看正在运行的容器
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c0f22db41e5b centos "/bin/bash -c 'while…" About an hour ago Up About an hour daemon_while
解释:
CONTAINER ID:容器ID。64位的十六进制数,这里只显示了12位,一般使用前几位就可以标识该容器。
IMAGE:创建容器时使用的镜像。
COMMAND:容器最后运行的命令。
CREATED:创建容器的时间。
STATUS:容器的状态。UP时间(运行时间)、Exited(0)停止状态,后面的数字标识错误码,0为正常退出。
PORTS:对外开放的端口。
NAMES:容器名。和容器的ID一样可以标识容器,同样必须是唯一的。
-a 选项 查看所有状态的容器信息
-l 选项 查看最近创建的容器
-n=2 表示查看最近创建的两个容器
启停容器
docker start启动停止状态的容器
docker stop终止运行状态的容器
# docker stop daemon_while
# docker start daemon_while
# docker run --restart=always --name docker_restart -d centos /bin/bash -c "while true;do echo hello;sleep 1;done"
解释:
–restart选项:检查容器退出码决定是否需要重启容器,always不论返回多少都会重启;on-failure返回值非0时重启容器;on-failure:3表示收到非0的返回码后,最多尝试重启容器3次
删除容器
docker rm删除停止状态的容器,使用-f选项可以强制删除运行状态的容器。
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c0f22db41e5b centos "/bin/bash -c 'while…" About an hour ago Up 9 minutes daemon_while
# docker rm daemon_while
Error response from daemon: You cannot remove a running container c0f22db41e5b4ab9b393c9e206e454b6e83b0623e227346aeb4e1765b15a679c. Stop the container before attempting removal or force remove
# docker rm -f daemon_while
daemon_while
删除所有容器
# doker rm `docker ps -a -q`
解释:
-q选项 列出容器的ID,不显示容器的其它信息
查看容器日志
docker logs将容器输出到标准输出的数据作为日志输出到运行该指令的终端上。
# docker run -d --name daemon_logs centos /bin/bash -c 'for((i=0;1;i++));do echo $i;sleep 1;done;'
3c505af5b09c4aee5041d1289ab7e7894fd113906d152819e677b97c41f8e3f4
# docker logs -f -t --tail=5 deamon_logs
2018-06-05T01:58:57.433320584Z 91
2018-06-05T01:58:58.439360511Z 92
2018-06-05T01:58:59.443168270Z 93
2018-06-05T01:59:00.444004989Z 94
2018-06-05T01:59:01.447599614Z 95
2018-06-05T01:59:02.451474698Z 96
2018-06-05T01:59:03.455503486Z 97
2018-06-05T01:59:04.458988731Z 98
2018-06-05T01:59:05.471867807Z 99
解释:
-f选项 动态显示日志
-t选项 显示日志的产生时间
- -tail=n选项 显示最后的n条日志数据
查看容器进程
docker top查看容器中正在运行的进程。
# docker top daemon_logs
UID PID PPID C STIME TTY TIME CMD
root 2615 2598 0 09:57 ? 00:00:01 /bin/bash -c for((i=0;1;i++));do echo $i;sleep 1;done;
root 3293 2615 0 10:06 ? 00:00:00 sleep 1
查看容器信息
docker inspect用于查看容器的配置信息,包含容器名、环境变量、运行命令、主机配置、网络配置和数据卷配置等。
# docker inspect daemon_logs
[
{
"Id": "3c505af5b09c4aee5041d1289ab7e7894fd113906d152819e677b97c41f8e3f4",
"Created": "2018-06-05T01:53:39.251068388Z",
"Path": "/bin/bash",
"Args": [
"-c",
"for((i=0;1;i++));do echo $i;sleep 1;done;"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 2615,
"ExitCode": 0,
"Error": "",
"StartedAt": "2018-06-05T01:57:26.090166473Z",
"FinishedAt": "2018-06-05T01:55:24.555274393Z"
},
...
使用-f或者--format可以查看指定部分的信息。
查看容器的运行状态:
# docker inspect --format='{{.State.Running}}' daemon_logs
true
查看容器的IP地址:
# docker inspect --format='{{.NetworkSettings.IPAddress}}' daemon_logs
172.17.0.2
容器内执行命令
docker exec在容器中创建任务。
# docker exec -d daemon_logs touch /tmp/test.txt
同样可以进入交互模式下的容器,再进行容器内的指令操作,使用-t和-i选项。
容器的导入和导出
docker import容器导入
docker export容器导出
导出容器到本地为tar包
# docker export daemon_logs > my_container.tar
# ls
my_container.tar
将导出的tar包作为镜像导入
# cat my_container.tar | docker import - imported
sha256:4a0e96dc710ce55e17cea03c84c6cd27522a2426262125acfc386ff39fe9832b
查看镜像
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
imported latest 4a0e96dc710c 27 seconds ago 199MB
centos latest e934aafc2206 8 weeks ago 199MB
导入网络上的容器
#docker import url res:tag
url表示网络地址
res表示镜像
tag表示标记
容器网络基础
Dokcer启动后,会在宿主机上创建名为docker0的虚拟网络接口。创建的容器会获得该网段的IP。
# ifconfig docker0
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:85ff:fea8:ef51 prefixlen 64 scopeid 0x20<link>
ether 02:42:85:a8:ef:51 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3 bytes 258 (258.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
暴露网络端口
通过端口映射能实现容器对外提供服务的基础方法。
docker run 在创建并运行容器时
-P(大写)选项可以将宿主机的随机端口映射到容器中服务监听的端口
-p(小写)选项可以指定宿主机上的端口映射到容器中服务监听的端口
-p 选项的写法:
宿主机ip:宿主机端口:容器端口 将宿主机IP和端口映射到容器端口
宿主机ip::容器端口 将宿主机IP和随机端口映射到容器端口
宿主机端口:容器端口 将宿主机端口映射到容器端口
如果要映射的端口是多个,再次添加-p选项即可
# docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
3d77ce4481b1: Pull complete
73674f4d9403: Pull complete
d266646f40bd: Pull complete
ce7b0dda0c9f: Pull complete
01729050d692: Pull complete
014246127c67: Pull complete
7cd2e04cf570: Pull complete
Digest: sha256:72f2b4aa99235509146bd12054d1a93c1c869ba60212d21729118c93ca4305d3
Status: Downloaded newer image for httpd:latest
# docker run -d -P --name httpd-1 httpd
330d3885885800c574b39ea0ef5241d01b32e6a6eb0af667fc331b9a00237750
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
330d38858858 httpd "httpd-foreground" 29 seconds ago Up 28 seconds 0.0.0.0:32788->80/tcp httpd-1
# curl localhost:32788
<html><body><h1>It works!</h1></body></html>
# docker run -d -p 80:80 --name=httpd-2 httpd
007014c939f291a9586069d40b688750a9fd2978b21e2138b66bc032225ff851
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
007014c939f2 httpd "httpd-foreground" 8 seconds ago Up 7 seconds 0.0.0.0:80->80/tcp httpd-2
330d38858858 httpd "httpd-foreground" 14 minutes ago Up 14 minutes 0.0.0.0:32788->80/tcp httpd-1
# docker port httpd-2
80/tcp -> 0.0.0.0:80
# curl localhost
<html><body><h1>It works!</h1></body></html>
Docker镜像管理
查看
docker images查看本机上所有镜像
#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
imported latest 4a0e96dc710c 13 minutes ago 199MB
centos latest e934aafc2206 8 weeks ago 199MB
解释:
REPOSITORY:仓库名称。用于存放同一类型镜像。
TAG:镜像名称。用于区分不同镜像,如果未指定默认为latest。
IMAGE ID:镜像唯一标识。
CREATED:镜像创建时间。
SIZE:镜像大小
下载
docker run指定镜像创建容器时,现在本机上寻找该镜像,如果不存在,就会继续去Docker Hub上搜索符合条件的镜像下载到本地后再去创建容器。
Docker Hup上有很多用户或组织创建的镜像,对于已经存在的镜像,可以直接下载来使用,没有必要再去重复造轮子。
docker search可以在Docker Hub上搜索镜像
# docker search wordpress
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
wordpress The WordPress rich content management system… 2308 [OK]
bitnami/wordpress Bitnami Docker Image for WordPress 73 [OK]
appcontainers/wordpress Centos/Debian Based Customizable Wordpress C… 34 [OK]
tutum/wordpress Out-of-the-box Wordpress docker image 28
centurylink/wordpress Wordpress image with MySQL removed. 14 [OK]
etopian/alpine-php-wordpress Alpine WordPress Nginx PHP-FPM WP-CLI 13
...
解释:
NAME:镜像名称。由命名空间和仓库名组成,没有命名空间,说明该镜像属于Docker Hub的官方镜像。
DESCRIPTION:镜像的简要描述。
STARS:用户对镜像的评分。
OFFICIAL:是否为官方镜像。
AUTOMATED:是否使用了自动构建。
docker pull可以把镜像拉取到本地。镜像名必须是完整的(命名空间和仓库名),如果仓库有多个镜像,还需要指定TAG。
删除
docker rmi删除本地镜像。容器没有依赖镜像,才能删除掉,也可以使用-f强制删除镜像。
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
imported latest 4a0e96dc710c 38 minutes ago 199MB
centos latest e934aafc2206 8 weeks ago 199MB
# docker rmi imported
Untagged: imported:latest
Deleted: sha256:4a0e96dc710ce55e17cea03c84c6cd27522a2426262125acfc386ff39fe9832b
Deleted: sha256:702cc069a24c49b6282c5b8d219bbd1d253a59f5bad5e963206aa40d8421ba92
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest e934aafc2206 8 weeks ago 199MB
创建本地镜像
docker commit将容器提交到本地仓库中,形成一个全新的镜像。
[root@docker ~]# docker run -it centos
[root@bcd97f4c90fb /]# yum install net-tools -y
[root@bcd97f4c90fb /]# exit
[root@docker ~]# # docker commit -m="net-tools" --author="Harry" bcd97f4c90fb harry/net-tools:v1
sha256:987ebf14259adc0048fa8026f50da7e105502165719505ff845c54cc79776b53
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
harry/net-tools v1 987ebf14259a 23 seconds ago 269MB
centos latest e934aafc2206 8 weeks ago 199MB
解释:
-m选项:描述镜像信息
- -author选项:作者
bcd97f4c90fb:容器ID
harry/net-tools:v1 仓库名/镜像名:版本名
数据卷
数据卷是提供容器使用的特殊目录,可以多个容器之间共享目录;可以宿主机和容器之间共享目录。
创建数据卷
# docker run -d -i -t -v /opt/data --name data centos /bin/bash
ff0745c73a79280a22da160d51884b98be372dced124fa8fb9c162a9e3929152
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ff0745c73a79 centos "/bin/bash" 6 seconds ago Up 6 seconds data
# docker inspect data | grep data
"Name": "/data",
"Source": "/var/lib/docker/volumes/fa78592f15675a00994e95598c8f7f1fe7610665e4b4ed2038bd8947c0b9558a/_data",
"Destination": "/opt/data",
"/opt/data": {}
# cd /var/lib/docker/volumes/fa78592f15675a00994e95598c8f7f1fe7610665e4b4ed2038bd8947c0b9558a/_data
# echo "hello" > test.txt
[root@docker ~]# docker attach data
[root@ff0745c73a79 /]# cat /opt/data/test.txt
hello
挂载主机目录作为数据卷
# docker run -d -i -t --name localdata -v /opt/data/:/opt/data/ centos
cd /opt/data/
# echo "Hi" > test.txt
[root@docker ~]# docker attach localdata
[root@39a7388c8cd9 /]# cat /opt/data/test.txt
Hi
创建的数据卷默认是可读写的,如果写成 -v /opt/data/:/opt/data/:ro则创建的是只读数据卷。除了目录,文件也一样的操作。如果挂载的对象容器中是存在的,则会覆盖。
数据卷容器
在创建容器时,使用volumes-from选项可以指定数据卷容器。
创建专门用于挂载的数据卷容器
# docker run -d -v /data --name data centos
创建容器时指定数据卷容器
# docker run -d --volumes-from=data --name db1 centos
查看到数据卷是一样的
# docker inspect db1 data --format {{.Mounts}}
[{volume eef2aa73468f48f678c313e715eefd435f60711eac274477a6955ce07ebd762c /var/lib/docker/volumes/eef2aa73468f48f678c313e715eefd435f60711eac274477a6955ce07ebd762c/_data /data local true }]
[{volume eef2aa73468f48f678c313e715eefd435f60711eac274477a6955ce07ebd762c /var/lib/docker/volumes/eef2aa73468f48f678c313e715eefd435f60711eac274477a6955ce07ebd762c/_data /data local true }]
删除数据卷,需要先删除所有的容器,并且最后一个依赖的容器删除时要加-v。
数据的备份和恢复
备份
创建数据卷容器,模拟数据备份源。
# docker run -d -v /data --name data centos
# docker inspect data --format {{.Mounts}}
[{volume 46baadf2f40c7a8863b3d93f34c4142616c88256f33e1f541124cd48d80b6bdb /var/lib/docker/volumes/46baadf2f40c7a8863b3d93f34c4142616c88256f33e1f541124cd48d80b6bdb/_data /data local true }]
模拟产生数据
# cp /etc/fstab /var/lib/docker/volumes/46baadf2f40c7a8863b3d93f34c4142616c88256f33e1f541124cd48d80b6bdb/_data
开始备份数据卷容器/data目录下产生的数据
# docker run --volumes-from data -v /backup:/backup centos tar cvf /backup/backup.tar /data
宿主机上看到备份
# ls /backup/
backup.tar
恢复
创建需要恢复的数据容器
# docker run -v /data --name data2 centos
利用data数据卷容器关联到本地备份的目录
# docker run --volumes-from data2 -v /backup/:/backup/ centos tar xvf /backup/backup.tar
# docker inspect data2 --format {{.Mounts}}
[{volume b3be616d962edb6c8e023d0db9a46214044142814d2dcb4e5149a4fa29227ed5 /var/lib/docker/volumes/b3be616d962edb6c8e023d0db9a46214044142814d2dcb4e5149a4fa29227ed5/_data /data local true }]
查看到data2容器的数据卷中有了备份的文件
# ls /var/lib/docker/volumes/b3be616d962edb6c8e023d0db9a46214044142814d2dcb4e5149a4fa29227ed5/_data/
fstab
容器连接
link做连接的选项,写法:–link name:alias
name是源容器的名称
alias是连接的别名
建立数据库容器,容器命名为db
# docker run --name db --env MYSQL_ROOT_PASSWORD=123456 -d mariadb
建立wordpress容器与db容器连接
# docker run --name mybbs --link db:mysql -p 80:80 -d wordpress
可以使用浏览器访问宿主机的ip:80,进入bbs设置向导