Docker镜像创建、数据卷、端口映射

Docker镜像

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

Docker镜像分层

  • FROM centso:7.4
  • ADD run.sh/
  • VOLUME /data
  • CMD ["./run.sh"]

1、Dockerfile中的每个指令都会创建一个新的镜像层
2、镜像层将被缓存和复用
3、当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效
4、某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效
5、镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件

Docker镜像的创建方法

1、基于已有镜像创建

命令格式:docker commit -m "newcentos7" -a "abc" 容器ID号 新建镜像名称
-m说明信息
-a作者信息
-p生成过程中停止容器的运行
[root@docker ~]# docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              bc9a0695f571        30 hours ago        133MB
centos              7                   8652b9f0cb4c        12 days ago         204MB
[root@docker ~]# docker create -it centos:7 /bin/bash
f3b0b5f3320f910f2bf03e2aebf2b0964635288e1c4bc10c9bddefb917413d2e
[root@docker ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f3b0b5f3320f        centos:7            "/bin/bash"         5 seconds ago       Created                                 charming_lewin
[root@docker ~]# docker commit -m "newcentos" -a "dacker" f3b0b5f3320f newcentos:7.4
sha256:acc3556d12c01845f0af34a07a93c4bb81bdcc2aa09aa412f7220a53176fbf25
[root@docker ~]# docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
newcentos           7.4                 acc3556d12c0        10 seconds ago      204MB
nginx               latest              bc9a0695f571        30 hours ago        133MB
centos              7                   8652b9f0cb4c        12 days ago         204MB

2、基于本地模板创建

[root@docker ~]#wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
[root@docker ~]# cat debian-7.0-x86-minimal.tar.gz |docker import - abc:123
[root@docker ~]# docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
abc                 123                 4e5fb0151452        31 seconds ago      215MB
newcentos           7.4                 acc3556d12c0        9 minutes ago       204MB
nginx               latest              bc9a0695f571        30 hours ago        133MB
centos              7                   8652b9f0cb4c        12 days ago         204MB
[root@docker ~]#

3、基于Dockerfile创建

指令含义
FROM镜像指定新镜像所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令。
MAINTAINER名字说明新镜像的维护人信息
RUN命令在所基于的镜像上执行命令,并提交到新的镜像中
CMD[“要运行的程序“,”参数1,“参数2“]指令启动容器时要运行的命令或者脚本,Dockerfile只能有一条CMD命令,如果指定多条则只能最后一条被执行
EXPOSE端口号指定新镜像加载到Docker时要开启的端口
ENV环境变量变量值设置一个环境变量的值,会被后面的RUN使用
ADD 源文件/目录目标文件/目录将源文件复制到目标文件,源文件要与Dockerfile位于相同目录中,或者是一个URL
COPY 源文件/目录目标文件/目录将本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中
VOLUME[“目录“]在容器中创建一个挂载点
USER 用户名/UID指定运行容器时的用户
WORKDIR路径为后续的RUN、CMD、ENTRYPOINT指定工作目录
ONBUILD命令指定所生成的镜像作为一个基础镜像时所要运行的命令
HEALTHCHECK健康检查

3.1、查看当前镜像

[root@docker apache]# docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7                   8652b9f0cb4c        12 days ago         204MB

3.2、创建一个目录用于放Dockerfile文件

[root@docker ~]# mkdir apache
[root@docker ~]# cd apache/
[root@docker apache]# vim Dockerfile
#基于已有的镜像名称
FROM centos:7
#维护镜像的用户信息
MAINTAINER this is apache
#镜像操作指令安装apache软件
#更新yum源
RUN yum -y update  
RUN yum -y install httpd
#开启80端口
EXPOSE 80
#复制网站首页文件
ADD index.html /var/www/html/index.html
#设置执行脚本复制镜像中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
#启动容器时执行脚本
CMD ["/run.sh"]
[root@docker apache]# vim index.html
<h1>This is apache</h1>
[root@docker apache]# vim run.sh
#!/bin/bash
rm -fr /run/httpd/*
exec /usr/sbin/apachectl -D FOREGROUND

3.3、生成镜像

[root@docker apache]# docker build -t httpd:web .		#注意末尾有.
--tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
[root@docker apache]# docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
httpd               web                 514fe4b186c1        6 seconds ago       476MB
centos              7                   8652b9f0cb4c        12 days ago         204MB

3.4、创建键容器并运行容器

[root@docker apache]# docker run -d -p 1356:80 httpd:web
[root@docker apache]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
519670c8a252        httpd:web           "/run.sh"           13 seconds ago      Up 11 seconds       0.0.0.0:1356->80/tcp   inspiring_shaw

3.5、测试
在这里插入图片描述

创建私有仓库

1、拉取registry镜像

[root@docker ~]# docker pull registry
[root@docker ~]# docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
registry            latest              2d4f4b5309b1        5 months ago        26.2MB

2、添加私有仓库地址

[root@docker ~]# vim /etc/docker/daemon.json
{
  "insecure-registries": ["20.0.0.10:5000"],	#增加
  "registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"]	#阿里云加速地址,可以登录自己的阿里云账号查看
}

3、重启docker

[root@docker ~]# systemctl restart docker.service

4、创建registry容器

[root@docker ~]# docker create -it registry /bin/bash
[root@docker ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
2ddfce6acd6f        registry            "/entrypoint.sh /bin…"   7 seconds ago       Created                                 jovial_bartik

5、开启registry容器

[root@docker ~]# docker start 2ddfce6acd6f

6、设置目录挂载到容器中

[root@docker ~]# docker run -d -p 20.0.0.10:5000:5000 -v /data/registry:/tmp/registry registry
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-d: 后台运行容器,并返回容器ID
--volume , -v:	绑定一个卷
[root@docker ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS                      NAMES
8f16c352d187        registry            "/entrypoint.sh /etc…"   39 seconds ago      Up 38 seconds                20.0.0.10:5000->5000/tcp   tender_edison
2ddfce6acd6f        registry            "/entrypoint.sh /bin…"   2 minutes ago       Exited (127) 2 minutes ago                              jovial_bartik

7、设置镜像标签用于上传仓库

[root@docker ~]# docker pull nginx		#下载一个nginx测试上传,也可以使用本地镜像上传
[root@docker ~]# docker tag nginx:latest 20.0.0.10:5000/nginx
[root@docker ~]# docker images 
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
20.0.0.10:5000/nginx   latest              bc9a0695f571        32 hours ago        133MB
nginx                  latest              bc9a0695f571        32 hours ago        133MB
registry               latest              2d4f4b5309b1        5 months ago        26.2MB

8、上传镜像到仓库

[root@docker ~]# docker push 20.0.0.10:5000/nginx

9、获取仓库列表

[root@docker ~]# curl -XGET http://20.0.0.10:5000/v2/_catalog
{"repositories":["nginx"]}

10、下载私有仓库镜像

[root@docker ~]# docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
registry            latest              2d4f4b5309b1        5 months ago        26.2MB
[root@docker ~]# docker pull 20.0.0.10:5000/nginx	#ip地址为本地仓库ip地址由于我是一台服务器所有就使用本机ip地址
Using default tag: latest
latest: Pulling from nginx
852e50cd189d: Pull complete 
571d7e852307: Pull complete 
addb10abd9cb: Pull complete 
d20aa7ccdb77: Pull complete 
8b03f1e11359: Pull complete 
Digest: sha256:99d0a53e3718cef59443558607d1e100b325d6a2b678cd2a48b05e5e22ffeb49
Status: Downloaded newer image for 20.0.0.10:5000/nginx:latest
20.0.0.10:5000/nginx:latest
[root@docker ~]# docker images 
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
20.0.0.10:5000/nginx   latest              bc9a0695f571        32 hours ago        133MB
registry               latest              2d4f4b5309b1        5 months ago        26.2MB

Docker数据卷

宿主机《-----------》容器(实现主机和容器挂载目录直接的同步)

在这里插入图片描述1、下载一个centos进行测试

[root@docker ~]# docker pull cetos

2、将宿主机目录/var/www 目录挂载到容器/data1

[root@docker ~]# docker run -v /var/www:/data1 --name web1 -it centos /bin/bash	#进入容器里面
[root@3b2e696e7596 /]# ls
bin  data1  dev  etc  home  lib  lib64	lost+found  media  mnt	opt  proc  root  run  sbin  srv  sys  tmp  usr	var

3、进入data1目录创建文件去主机目录测试

[root@3b2e696e7596 /]# cd data1/
[root@3b2e696e7596 data1]# echo "vszjv" > a.txt
[root@3b2e696e7596 data1]# echo "vszjv" > b.txt
[root@3b2e696e7596 data1]# ls
a.txt  b.txt

4、进入主机/var/www目录创查看是否有文件生成

[root@docker ~]# cd /var/www/
[root@docker www]# ll
总用量 8
-rw-r--r-- 1 root root 6 1126 17:21 a.txt
-rw-r--r-- 1 root root 6 1126 17:21 b.txt
[root@docker www]# cat a.txt 
vszjv

数据容器卷

容器《-----------》容器(实现容器之间数据同步)创建数据卷容器(将/data1和/data2共享出来)

[root@docker ~]# docker run --name web-1 -v /data1 -v /data2 -it centos /bin/bash
-name="nginx-lb": 为容器指定一个名称;
[root@7757e295152c /]# ls  
bin  data1  data2  dev	etc  home  lib	lib64  lost+found  media  mnt  opt  proc  root	run  sbin  srv	sys  tmp  usr  var
[root@7757e295152c /]# cd data1
[root@7757e295152c data1]# echo "csjav">a.txt
[root@7757e295152c data1]# echo "csjav">b.txt
[root@7757e295152c data1]# cd ..
[root@7757e295152c /]# cd /data2
[root@7757e295152c data2]# echo "cskvjjsz">1.txt
[root@7757e295152c data2]# echo "cskvjjsz">2.txt

创建新容器并将数据卷容器的共享目录挂载到自己上面

[root@docker ~]# docker run -it --volumes-from web-1 --name /data centos /bin/bash
[root@02b9d457c2e8 /]# ls
bin  data1  data2  dev	etc  home  lib	lib64  lost+found  media  mnt  opt  proc  root	run  sbin  srv	sys  tmp  usr  var
[root@02b9d457c2e8 /]# cd data1
[root@02b9d457c2e8 data1]# ls
a.txt  b.txt
[root@02b9d457c2e8 data1]# cd ..
[root@02b9d457c2e8 /]# cd data2
[root@02b9d457c2e8 data2]# ls
1.txt  2.txt

端口映射

1、随机端口映射(端口号:32768开始))

[root@docker ~]# docker run -d -P nginx:latest
-d: 后台运行容器,并返回容器ID;
-P: 随机端口映射,容器内部端口随机映射到主机的端口
[root@docker ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                      PORTS                      NAMES
44f29a0c974e        nginx:latest        "/docker-entrypoint.…"   About a minute ago   Up About a minute           0.0.0.0:32768->80/tcp      strange_panini

2、指定端口映射

[root@docker ~]# docker run -d -p 32769:80 nginx:latest
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
[root@docker ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                      NAMES
e9b98cee2b2a        nginx:latest        "/docker-entrypoint.…"   3 minutes ago       Up 3 minutes                0.0.0.0:32769->80/tcp      laughing_mclean
44f29a0c974e        nginx:latest        "/docker-entrypoint.…"   9 minutes ago       Up 9 minutes                0.0.0.0:32768->80/tcp      strange_panini
02b9d457c2e8        centos              "/bin/bash"              38 minutes ago      Up 32 minutes                                          data
7757e295152c        centos              "/bin/bash"              2 hours ago         Exited (0) 33 minutes ago                              web-1
3b2e696e7596        centos              "/bin/bash"              2 hours ago         Exited (0) 2 hours ago                                 web1
8f16c352d187        registry            "/entrypoint.sh /etc…"   3 hours ago         Up 3 hours                  20.0.0.10:5000->5000/tcp   tender_edison
2ddfce6acd6f        registry            "/entrypoint.sh /bin…"   3 hours ago         Exited (127) 3 hours ago                               jovial_bartik

容器互连

1、创建一个容器使用随机端口自动映射

[root@docker ~]# docker run -itd -P --name nginx1 centos /bin/bash

2、创建另个容器使用随机端口自动映射

[root@docker ~]# docker run -itd -P --name nginx2 --link nginx1:nginx1 centos:latest /bin/bash
 --link: 添加链接到另一个容器;

3、进入nginx2容器ping nginx1

[root@docker ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                      NAMES
b5a73beb7a21        centos:latest       "/bin/bash"              6 minutes ago       Up 5 minutes                                          nginx2
52e310c2607f        centos              "/bin/bash"              11 minutes ago      Up 11 minutes                                         nginx1
e9b98cee2b2a        nginx:latest        "/docker-entrypoint.…"   20 minutes ago      Up 20 minutes              0.0.0.0:32769->80/tcp      laughing_mclean
44f29a0c974e        nginx:latest        "/docker-entrypoint.…"   26 minutes ago      Up 26 minutes              0.0.0.0:32768->80/tcp      strange_panini
8f16c352d187        registry            "/entrypoint.sh /etc…"   3 hours ago         Up 3 hours                 20.0.0.10:5000->5000/tcp   tender_edison
2ddfce6acd6f        registry            "/entrypoint.sh /bin…"   3 hours ago         Exited (127) 3 hours ago                              jovial_bartik
[root@docker ~]# docker exec -it b5a73beb7a21 /bin/bash
[root@b5a73beb7a21 /]# ping nginx1
PING nginx1 (172.17.0.6) 56(84) bytes of data.
64 bytes from nginx1 (172.17.0.6): icmp_seq=1 ttl=64 time=0.136 ms
64 bytes from nginx1 (172.17.0.6): icmp_seq=2 ttl=64 time=0.040 ms
64 bytes from nginx1 (172.17.0.6): icmp_seq=3 ttl=64 time=0.068 ms
```

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值