文章目录

  • Docker镜像的创建
  • 私有仓库建立(字符版)
  • Docker 数据卷
  • 数据卷容器
  • 端口映射
  • 容器互连


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的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效
某一层的镜像缓存失效之后,它之后的镜像层都会失效
镜像层时不可变的,如果在某一层中添加一个文件,然后再下一层中删除它,则镜像中依然会包含该文件

docker镜像和实际包有区别可以吗 镜像和docker的关系_centos


附加:共分为4层:分层由下而上 (每一层产生一个容器,一共会四个容器,但传递到下一层时会自动化删除(此时产生容器具有临时性))

Docker镜像的创建

Docker镜像

应用发布的标准格式
支撑一个Docker容器的运行

Docker镜像的创建方法(三种方式)

基于已有镜像创建
基于本地模板创建
(重点)基于Dockerfile创建(类似于DIY自定义)

案例:构建各类Docker镜像服务

案例环境

docker镜像和实际包有区别可以吗 镜像和docker的关系_Dockerfile_02


基于已有镜像创建

将容器里面运行的程序及运行环境打包生成新的镜像
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每行支持一条指令,每条指令可携带多个参数,支持使用以“#"号开头的注释

docker镜像和实际包有区别可以吗 镜像和docker的关系_centos_03

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/

docker镜像和实际包有区别可以吗 镜像和docker的关系_apache_04

私有仓库建立(字符版)

#拉取镜像
[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

docker镜像和实际包有区别可以吗 镜像和docker的关系_docker_05

数据卷容器

数据卷容器:作用场景

docker镜像和实际包有区别可以吗 镜像和docker的关系_Dockerfile_06


数据卷容器,新容器挂载数据卷容器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