docker中容器和镜像的关系
docker的整个生命周期有三部分组成:镜像(image)+容器(container)+仓库(repository)。容器是由镜像实例化而来。
也可以说,镜像是文件,容器是进程。容器是基于镜像创建的,即容器中的进程依赖于镜像中的文件。
docker 的镜像概念类似虚拟机的镜像。是一个只读的模板,一个独立的文件系统,包括运行容器所需的数据,可以用来创建新的容器。
docker利用容器来运行应用:docker容器是由docker镜像创建的运行实例。
docker容器类似虚拟机,可以执行包含启动,停止,删除等。每个容器间是相互隔离的。容器中会运行特定的运用,包含特定应用的代码及所需的依赖文件。可以把容器看作一个简易版的linux环境(包含root用户权限,进程空间,用户空间和网络空间等)和运行在其中的应用程序。
在Docker的生命周期中,最核心的两个部分,一个是镜像 Images,一个是容器 Containers。镜像运行起来就是容器。容器服务运行的过程中,基于原始镜像做了改变,比如安装了程序,添加了文件,也可以提交回去 (commit)成为镜像。
如果大家安装过系统,镜像有点像 GHOST镜像,从 GHOST镜像安装一个系统,运行起来,就相当于容器;容器里面自带应用,就像 GHOST镜像安装的系统里面不是裸的操作系统,里面可能安装了一些软件。安装好的系统使用过程中又安装了其他软件,或者下载了文件,还可以将这个系统重新 GHOST成一个镜像,当其他人通过这个镜像再安装系统的时候,则其他的软件也就自带了。
普通的 GHOST镜像就是一个文件,但是管理不方便。比如如果有几十个 GHOST镜像的话,你可能已经记不清楚哪个镜像里面安装了哪个版本的软件了。所以容器镜像有 tag的概念,就是一个标签,比如 dev-1.0,dev-2.0,production-1.1等,能够帮助你区分不同的镜像都可以。
为了镜像的统一管理,有一个镜像库的东西,可以通过 push将本地的镜像放到统一的镜像库中保存,可以通过 pull将镜像库中的镜像拉到本地来
镜像Dockerfile生成的过程
Dockerfile中的每个指令都会创建一个新的镜像层
镜像层将被缓存和复用
当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效
某一层的镜像缓存失效之后,它之后的镜像层都会失效
镜像层时不可变的,如果在某一层中添加一个文件,然后再下一层中删除它,则镜像中依然会包含该文件
附加:共分为4层:分层由下而上 (每一层产生一个容器,一共会四个容器,但传递到下一层时会自动化删除(此时产生容器具有临时性))
Docker镜像的创建
Docker镜像
应用发布的标准格式
支撑一个Docker容器的运行
Docker镜像的创建方法(三种方式)
基于已有镜像创建
基于本地模板创建
(重点)基于Dockerfile创建(类似于DIY自定义)
案例:构建各类Docker镜像服务
案例环境
基于已有镜像创建
将容器里面运行的程序及运行环境打包生成新的镜像
docker commit [选项]容器ID/名称 仓库名称:[标签]
-m说明信息
-a作者信息
-p生成过程中停止容器的运行 //相当于快照
docker commit:提交你所安排要做的镜像文件
附加:数据库事务:一旦被commit提交之后便不能回滚(原因:一旦事务被进行提交,就代表事务的结束,下面进行的就是另外的事物了)
--基于已有的镜像容器进行创建---
//创建容器
docker create -it centos:7 /bin/bash
docker commit -m "new" -a "daoke" c83aee844ae0 daoke:test
docker images | grep daoke
[root@server1 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest bc9a0695f571 3 days ago 133MB
tomcat latest e0bd8b34b4ea 9 days ago 649MB
centos 7 8652b9f0cb4c 2 weeks ago 204MB
[root@server1 docker]# docker create -it centos:7 /bin/bash
29986e4a1da1d16e04faf700f2373a3c131af3f0bb01e7ef6b3a30614eab1ef1
[root@server1 docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
29986e4a1da1 centos:7 "/bin/bash" 9 seconds ago Created focused_fermi
[root@server1 docker]# docker start 29986e4a1da1
[root@server1 docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
29986e4a1da1 centos:7 "/bin/bash" 32 seconds ago Up 1 second focused_fermi
[root@server1 docker]# docker commit -m "new" -a "daoke" 29986e4a1da1 daoke:new
sha256:b8214346e25e929ddc6812a68067d392f2a00224983aedd1d51375f26a41844b
[root@server1 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
daoke new b8214346e25e 5 seconds ago 204MB
nginx latest bc9a0695f571 3 days ago 133MB
tomcat latest e0bd8b34b4ea 9 days ago 649MB
centos 7 8652b9f0cb4c 2 weeks ago 204MB
附加:运行状态的容器与停止状态的容器都可以创建镜像,但是允许状态创建的镜像可能会导致其数据丢失,故不推荐以运行状态的容器创建镜像
[root@server1 docker]# docker images | grep daoke
daoke new b8214346e25e 3 minutes ago 204MB
基于本地模板创建
通过导入操作系统模板文件生成新的镜像
使用wget命令导入为本地镜像
导入本地镜像debian-7.0-x86-minimal.tar.gz
[root@server1 ~]# cat debian-7.0-x86-minimal.tar.gz | docker import - docker:debian
sha256:91d49f99a942cf4737dadc1d4e25e738eeb94e2aa7d10b01e06ceb56b9f4926a
[root@server1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker debian 91d49f99a942 9 seconds ago 215MB
基于Dockerfile创建
Dockerfile是由一组指令组成的文件
Dockerfile结构四部分
基础镜像信息
维护者信息
●镜像操作指令
●容器启动时执行指令 (即CMD)
Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以“#"号开头的注释
Dockerfill创建
mkdir apache //root目录下创建apache目录
cd apache
vim Dockerfile (必须创建该名称)
#基于的基础镜像
FROM centos:7 //基于centos7系统构建apache
#维护镜像的用户信息
MAINTAINER this is project
#镜像操作指令安装apache软件
RUN yum -y update //更新yum
RUN yum -y install httpd //安装apache
#开启80端口
EXPOSE 80 //暴露容器的端口
#复制网站首页文件
ADD index.html /var/www/html/index.html //添加容器站点的位置
#将执行脚本复制到镜像中
ADD run.sh /run.sh //启动apache的脚本,现在宿主机中写好,然后添加到容器的根目录下 (前面run.sh宿主机的位置 后面run.sh是容器当中的位置 )
RUN chmod 755 /run.sh //赋予执行权限(因为在容器当中执行,所以要以RUN开头)
#启动容器时执行脚本
CMD ["/run.sh"] //启动容器时使它自动执行脚本
制作脚本
vim run.sh
#!/bin/bash
rm -rf/run/httpd/* 清空以前运行时候的配置文件,如果没有就相当于是格式化
exec /usr/sbin/apachectl -D FOREGROUND 启动apache
1 [root@server1 apache]# echo '<h1>this is kyo6</h1>' > index.html
2 [root@server1 apache]# ll #文件要放同一个目录
3 总用量 12
4 -rw-r--r--. 1 root root 402 11月 26 15:13 Dockerfile
5 -rw-r--r--. 1 root root 21 11月 26 15:16 index.html
6 -rw-r--r--. 1 root root 71 11月 26 15:15 run.sh
//生成镜像
docker build -t httpd:centos .(注意别忘了末尾有"." 前面是空格) httpd:centos:镜像名称 .:表示当前目录
//新镜像运行容器
docker run -d -p 1216:80 httpd:centos
[root@apache]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd centos 96b1b83bef02 About an hour ago 476MB
[root@server1 apache]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
39f1e83e4655 httpd:centos "/run.sh" 4 minutes ago Up 4 minutes 0.0.0.0:1216->80/tcp
//测试
http://20.0.0.10:1216/
私有仓库建立(字符版)
#拉取镜像
[root@server1 apache]#docker pull registry
-----------以下是显示下载完成信息-------
[root@server1 docker]# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
cbdbe7a5bc2a: Pull complete
47112e65547d: Pull complete
46bcb632e506: Pull complete
c1cc712bcecd: Pull complete
3db6272dcbfa: Pull complete
Digest: sha256:8be26f81ffea54106bae012c6f349df70f4d5e7e2ec01b143c46e2c03b9e551d
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest
----------------------------------------------------------
[root@server1 apache]# docker images
REPOSITORY TAG IMAGE ID CREATED
registry latest 2d4f4b5309b1 5 months ago 26.2MB
修改配置文件
[root@server1 apache]# vim /etc/docker/daemon.json
{
"insecure-registries": ["20.0.0.11:5000"], //添加
"registry-mirrors": ["https://e5rtts40.mirror.aliyuncs.com"]
}
重启服务
[root@server1 apache]# systemctl restart docker
创建镜像并查看
[root@server1 apache]# docker create -it registry /bin/bash
009d5fcd62cc75934f264f0b215d90ca7c66db1cd4a79141a388c2653fa4bbc4
[root@server1 apache]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
009d5fcd62cc registry "/entrypoint.sh /bin…" 25 seconds ago Created upbeat_payne
39f1e83e4655 httpd:centos "/run.sh" 20 minutes ago Exited (137) 57 seconds ago flamboyant_cori
[root@server1 apache]# docker start 009d5fcd62cc
009d5fcd62cc
[root@server1 apache]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
009d5fcd62cc registry "/entrypoint.sh /bin…" About a minute ago Exited (127) 1 second ago upbeat_payne
39f1e83e4655 httpd:centos "/run.sh" 21 minutes ago Exited (137) About a minute ag
宿主机的/data/registry自动创建挂载容器中的/tmp/registry
[root@server1 apache]# docker run -d -p 5000:5000 -v /data/registry:/tmp/regustry registry
ec7766988da01658d2c5e69a2f60b024ed8a5069634c05f7cf421eafa8307ec6
[root@server1 apache]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ec7766988da0 registry "/entrypoint.sh /etc…" 3 seconds ago Up 2 seconds 0.0.0.0:5000->5000/tcp quirky_euler
009d5fcd62cc registry "/entrypoint.sh /bin…" 7 minutes ago Exited (127) 6 minutes ago upbeat_payne
39f1e83e4655 httpd:centos "/run.sh" 27 minutes ago Exited (137) 8 minutes ago
-v:会自动创建文件目录并挂载
-d:守护进程
私有仓库的端口号为5000
//更改标记为20.0.0.11:5000/httpd
[root@server1 apache]# docker tag httpd:centos 20.0.0.11:5000/httpd
上传并获取
上传
[root@server1 apache]# docker push 20.0.0.11:5000/httpd
The push refers to repository [20.0.0.11:5000/httpd]
989cd84168d6: Pushed
4f2817252df2: Pushed
17206b7b0ef7: Pushed
a1d0be4349ae: Pushed
693de6fb9a7b: Pushed
174f56854903: Pushed
latest: digest: sha256:745742288226df1a9739eaeac25c44e38a1e933a88a9ecd3e20db78cb7db5ad5 size: 1574
获取私有仓库列表
[root@server1 apache]# curl -XGET http://20.0.0.11:5000/v2/_catalog
{"repositories":["httpd"]}
测试私有仓库下载
[root@server1 apache]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ec7766988da0 registry "/entrypoint.sh /etc…" 8 minutes ago Up 8 minutes 0.0.0.0:5000->5000/tcp quirky_euler
[root@server1 apache]# docker pull 20.0.0.11:5000/httpd
Using default tag: latest
latest: Pulling from httpd
2d473b07cdd5: Already exists
fbc79c5a0791: Pull complete
a6eaec6c0288: Pull complete
97bad951c7b2: Pull complete
fb3faecd7b37: Pull complete
b7e259856bd4: Pull complete
Digest: sha256:745742288226df1a9739eaeac25c44e38a1e933a88a9ecd3e20db78cb7db5ad5
Status: Downloaded newer image for 20.0.0.11:5000/httpd:latest
20.0.0.11:5000/httpd:latest
Docker 数据卷
宿主机目录/var/www挂载容器中的/data1
-v 会自动进行创建目录进行挂载(宿主机与容器之间挂载)
/var/www:宿主系统上面的
/data1 容器内部
定义名字:web1
[root@server1 apache]# docker run -v /var/www:/data1 --name web1 -it centos:7 /bin/bash
Unable to find image 'centos:7' locally
7: Pulling from library/centos
Digest: sha256:0f4ec88e21daf75124b8a9e5ca03c37a5e937e0e108a255d890492430789b60e
Status: Downloaded newer image for centos:7 //发现自动进入该容器
进入data目录并创建文件,进行测试
[root@bd5b5b14ef65 /]# ls
anaconda-post.log bin data1 dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
[root@bd5b5b14ef65 /]# cd data1/
[root@bd5b5b14ef65 data1]# ll
total 0
drwxr-xr-x. 2 root root 6 Aug 4 2017 cgi-bin
drwxr-xr-x. 2 root root 6 Aug 4 2017 html
[root@bd5b5b14ef65 data1]# ls
cgi-bin html
[root@bd5b5b14ef65 data1]# echo "this is test" > test.txt
[root@bd5b5b14ef65 data1]# ll
total 4
drwxr-xr-x. 2 root root 6 Aug 4 2017 cgi-bin
drwxr-xr-x. 2 root root 6 Aug 4 2017 html
-rw-r--r--. 1 root root 13 Nov 28 13:05 test.txt
[root@bd5b5b14ef65 data1]# cat test.txt
this is test
宿主机 //查看 发现有该文件生成
[root@server1 ~]# cd /var/
[root@server1 var]# cd www/
[root@server1 www]# ll
总用量 4
drwxr-xr-x. 2 root root 6 8月 4 2017 cgi-bin
drwxr-xr-x. 2 root root 6 8月 4 2017 html
-rw-r--r--. 1 root root 13 11月 28 21:05 test.txt
[root@server1 www]# cat test.txt 宿主机查看
this is test
数据卷容器
数据卷容器:作用场景
数据卷容器,新容器挂载数据卷容器web100(容器内部挂载)
[root@server1 www]# docker run --name web100 -v /data1 -v /data2 -it centos:7 /bin/bash //运行后进入容器
[root@8767d3774195 /]# ls
anaconda-post.log data1 dev home lib64 mnt proc run srv tmp var
bin data2 etc lib media opt root sbin sys usr
另起一台主机
[root@server1 apache]# docker run -it --volumes-from web100 --name db1 centos:7 /bin/bash
[root@cb7d8b7095c4 /]# ls
anaconda-post.log data1 dev home lib64 mnt proc run srv tmp var
bin data2 etc lib media opt root sbin sys usr
[root@cb7d8b7095c4 /]# ls data1
[root@cb7d8b7095c4 /]# ls data2
容器内创建文件并查看
[root@8767d3774195 /]# cd data1/
[root@8767d3774195 data1]# touch 111.txt
[root@8767d3774195 data1]# ls
111.txt
[root@8767d3774195 data1]# cd ../data2/
[root@8767d3774195 data2]# touch 222.txt
[root@8767d3774195 data2]# ls
222.txt
另一台主机容器内查看
[root@cb7d8b7095c4 /]# ls data1/
111.txt
[root@cb7d8b7095c4 /]# ls data2/
222.txt
端口映射
[root@server1 apache]# docker run -d -P 20.0.0.11:5000/httpd
995561357ab6833b891942da1d14bd2cabb58081077dd1ea9790912aec161cf3
[root@server1 apache]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
995561357ab6 20.0.0.11:5000/httpd "/run.sh" 29 seconds ago Up 28 seconds 0.0.0.0:32768->80/tcp sharp_pasteur
[root@server1 apache]# docker run -d -P tomcat:latest #P随机端口号,从32768开始
f5590489baae412474b64d0d9bb2284eeba6395d5995ef04a83c204832fdb674
[root@server1 apache]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f5590489baae tomcat:latest "catalina.sh run" 6 seconds ago Up 5 seconds 0.0.0.0:32769->8080/tcp magical_dirac
995561357ab6 20.0.0.11:5000/httpd "/run.sh" 7 minutes ago Up 7 minutes 0.0.0.0:32768->80/tcp sharp_pasteur
[root@server1 apache]# docker ps -a #p指定端口号
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1a28b9e8c25 20.0.0.11:5000/httpd "/run.sh" 4 seconds ago Up 3 seconds 0.0.0.0:2222->80/tcp optimistic_ptolemy
容器互连
(使用centos镜像)
//创建并运行容器取名web11.端口号自动映射 --name:指定容器名
[root@server1 apache]# docker run -itd -P --name web11 centos:7 /bin/bash
b7e3827371cd43524dcf4f8a1c404c6675d97b5c7ccc895e7b17600726603d51
[root@server1 apache]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b7e3827371cd centos:7 "/bin/bash" 10 seconds ago Up 9 seconds web11
创建并运行容器取名web2
[root@server1 apache]# docker run -itd -P --name web22 --link web11:web11 centos:7 /bin/bash
7c8f1c462ed5d1416736bab3a4459b392596d4b774255e5d2cc3cc1b99a4b5ce
[root@server1 apache]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7c8f1c462ed5 centos:7 "/bin/bash" 4 seconds ago Up 3 seconds web22
进入web22容器 ping web1
[root@server1 apache]# docker exec -it 7c8f1c462ed5 /bin/bash
[root@7c8f1c462ed5 /]# ping web11
PING web11 (172.17.0.7) 56(84) bytes of data.
64 bytes from web11 (172.17.0.7): icmp_seq=1 ttl=64 time=0.122 ms
64 bytes from web11 (172.17.0.7): icmp_seq=2 ttl=64 time=0.065 ms
--link name:alias --link 容器名:别名
安装net工具
[root@b413c6cbf148 /]# yum -y install net-tools
[root@b413c6cbf148 /]# ifconfig #查询网址信息
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.6 netmask 255.255.0.0 broadcast 172.17.255.255 #第一个创建的容器地址是172.17.0.2,以此类推
ether 02:42:ac:11:00:06 txqueuelen 0 (Ethernet)
RX packets 7114 bytes 11320444 (10.7 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3999 bytes 219299 (214.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0