环境准备

准备三台虚拟机及其分别设置对应的IP地址:
web1:192.168.200.100 (安装docker-ce)
web2:192.168.200.200 (安装docker-ce)
proxy: 192.168.200.2 (安装docker仓库)

Dockerfile

** Dockerfile语法格式:**
-FROM:基础镜像
-MAINTAINER:镜像创建者信息
-EXPOSE:开放的端口
-ENV:设置变量
-ADD:复制文件到镜像
-RUN:制作镜像时执行的命令,可以有多个
-WORKDIR:定义容器默认工作目录
-CMD:容器启动时执行的命令,经可以有一条CMD

Dockerfile自定义镜像实例

** 1) 新建一个目录,并进入这个目录,作为命令执行的当前路径,复制一个配置yum源的repo文件到这个目录,然后编辑一个名为Dockerfile的文件,内容如下: **

#使用centos7.9:latest镜像作为基础镜像

FROM centos7.9:latest

#在新建镜像中删除/etc/yum.repos.d/中所有文件

RUN rm -f /etc/yum.repos.d/*

#复制当前目录中用于配置yum源的entOS-Http.repo文件到新建镜像中

ADD CentOS-Http.repo /etc/yum.repos.d/CentOS-http.repo

#在新建镜像中安装指定的软件包

RUN yum install -y vim net-tools psmic iproute openssl openssh-server openssh-askpass openssh-clients

** 2) 然后在当前路径下执行,执行创建自定义镜像:docker build -t test:latest . # -t指定新建镜像的名称; .指定Dockerfile文件在当前路径下在命令执行结束后,用docker images命令可以查看到新创建的镜像test:latest **

docker高级用户 docker高级教程_docker


docker高级用户 docker高级教程_私有仓库_02


** 3)运行这个自定义镜像,并进行测试:**

docker高级用户 docker高级教程_docker_03


** 3) 设置容器默认启动命令 **

** a) 制作一个镜像,用这个镜像启动容器后,服务为python **

新建一个目录 docker1,并且切换到这个目录中,编辑一个Dockerfile文件,文件内容如下:

FROM centos7.9:latest # 指定基础镜像

CMD ["/usr/bin/python"] # 指定容器启动时使用的默认命令

然后执行命令:docker build -t centos:python .

用这个自定义镜像启动一个容器:docker run -it centos:python

此镜像启动的容器,直接进入了python环境

docker高级用户 docker高级教程_centos_04


** b) 制作一个镜像,用这个镜像启动容器后,服务为sshd **

新建一个目录docker2, 并且切换到这个目录中,把配置yum源的repo复制到这个目录中,然后编辑一个Dockerfile文件,文件内容如下:

FROM centos7.9:latest

RUN rm -f /etc/yum.repos.d/*

ADD CentOS-Http.repo /etc/yum.repos.d/CentOS-http.repo

#安装sshd服务以及依赖的软件包

RUN yum install -y openssh-server initscripts

RUN sshd-keygen

#设置容器的root密码

RUN echo “abcd1234” | passwd --stdin root

#设置sshd服务所需的环境变量

ENV Envirnotallow=/etc/sysconfig/sshd

#开发这个容器22号端口

EXPOSE 22

#启动容器的ssh服务

CMD ["/usr/sbin/sshd","-D"]

执行以下命令可以创建新的镜像:docker build -t centos:sshd .

docker高级用户 docker高级教程_docker_05


用新创建的镜像启动一个容器,并在宿主机上用ssh连接这个容器,输入密码后,就可以远程登录这个容器。** 3) 制作一个镜像,用这个镜像启动容器后,直接启动apache服务 **

新建一个目录apache, 然后把配置yum源的repo文件复制到这个目录下。

切换到apache目录中,在当前路径中编辑一个名为Dockerfile,内容如下:

FROM centos7.9:latest

MAINTAINER yuyuyuliang00 xxxxx00@163.com

RUN rm -f /etc/yum.repos.d/*

ADD CentOS-Http.repo /etc/yum.repos.d/CentOS-http.repo

RUN yum install -y httpd

WORKDIR /var/www/html

ADD index.html index.html

ENV EnvironmentFile=/etc/sysconfig/httpd

ENV PS1=’[web2@\h \W]$ ’

EXPOSE 80

CMD ["/usr/sbin/httpd", “-DFOREGROUND”]

在当前路径下编辑一个index.html,用于复制到容器的工作目录/var/www/html下。

运行docker build -t centos:httpd .创建一个新的镜像。

docker高级用户 docker高级教程_私有仓库_06


用刚才新创建的镜像启动一个容器,然后在宿主机上用curl命令访问这个容器的web服务,访问成功。

docker高级用户 docker高级教程_私有仓库_07


** 4) 制作一个镜像,用这个镜像启动容器后,直接启动sshd和apache服务 **

以centos:sshd镜像为基础,再构建一个httpd服务的镜像

新建一个目录docker3,切换到这个目录下,在这个新目录中新建一个index.html文件,其内容如下:

docker高级用户 docker高级教程_docker_08


编辑一个start.sh文件,内容如下,并且用chmod +x start.sh设置这个文件的执行权限:

docker高级用户 docker高级教程_docker_09


编译用于创建新镜像的Dockerfile文件,内容如下:

docker高级用户 docker高级教程_后端_10


用上面的Dockerfile文件创建新的镜像centos:sshd_httpd:

docker高级用户 docker高级教程_私有仓库_11


用以上的镜像启动一个容器,并验证其sshd和httpd服务,都能成功访问:

docker高级用户 docker高级教程_后端_12


进入容器内部,查看其监听端口与对应的进程:

docker高级用户 docker高级教程_docker高级用户_13

自定义仓库

环境准备

**1、 安装私有仓库(服务端) **

在proxy(192.168.200.2)上创建私有镜像仓库:yum install docker-distribution

docker高级用户 docker高级教程_docker_14

2、启动私有仓库,并设置开机自启

docker高级用户 docker高级教程_centos_15


启动服务后,其监听端口是5000:

docker高级用户 docker高级教程_centos_16


查看当前镜像仓库中的数据,当前仓库中没有镜像:

docker高级用户 docker高级教程_docker_17

3、仓库配置文件及数据存储路径
1) /etc/docker-distribution/registry/config.yml
2) /var/lib/registry

4、修改客户端配置
在客户端(web1,web2)上修改配置文件:

  1. 在/etc/docker/目录下新建一个文件:daemon.json,然后添加如下内容,指定私有仓库地址和用非安全方式(http)
  2. 重启客户端docker程序:systemctl restart docker
    3)在客户端为上传镜像打上标签: docker tag 本地镜像名:标签 <上传私有仓库地址:端口>/镜像名:标签

上传镜像到私有仓库

用法:docker push <本地镜像名[格式:私有仓库地址:端口/镜像名:标签]>

docker高级用户 docker高级教程_docker高级用户_18


检查:查看私有仓库中所有仓库以及指定仓库中所有镜像:

所有仓库:curl http://192.168.200.2:5000/v2/_catalog

指定仓库下所有镜像:curl http://192.168.200.2:5000/v2/<仓库名>/tags/list

docker高级用户 docker高级教程_docker_19


在web1上用私有仓库中的镜像启动一个容器,并进行测试:

1) 复制web2上配置文件到web1

2) 重启docker

3) 以私有仓库中镜像启动一个容器

4)进行web和ssh测试

docker高级用户 docker高级教程_后端_20


docker高级用户 docker高级教程_docker高级用户_21

删除私有仓库中的镜像

** 准备工作 **

编辑/etc/docker-distribution/registry/config.yml,内容如下:

docker高级用户 docker高级教程_centos_22


** 在客户端操作 **

  1. 先上传一个本地镜像到私有仓库
    2)查看私有仓库中的镜像,多了一个lastest标签
    3)查看私有仓库中centos:lastest镜像的sha码
    4)删除私有仓库中centos:latest标签
  2. docker高级用户 docker高级教程_centos_23

  3. ** 在proxy上进行垃圾回收 **
  4. docker高级用户 docker高级教程_docker高级用户_24


容器的数据持久化存储:主机卷的映射

** 将真实机目录挂载到容器中提供持久化存储: **

1)目录不存在就自动创建

2)目录存在就直接覆盖掉

** 演示映射本地目录到容器中: **

1) 在主机上新建一个目录/var/webroot,在此目录中新建一个index.html文件,内容如下:

2) 在启动这个容器时,加上-v参数指定映射到<容器内目录>的<主机目录>

3) 访问提供web服务的容器,内容就是主机目录/var/webroot/下的index.html

docker高级用户 docker高级教程_centos_25

docker网络

1)新建子网: docker network create --subnet=10.10.10.0/24 docker1

docker高级用户 docker高级教程_docker高级用户_26


2)使用自定义网桥,启动容器:

在启动命令中使用–network指定容器要连接的网桥

docker高级用户 docker高级教程_后端_27

端口映射

1) 默认容器可以访问外网

2)外网的主机不可以访问容器内的资源

3)容器的特征是把属组机变成对应的服务

演示:

1)在启动容器时,用-p选项绑定宿主机端口和容器内端口,-v绑定宿主机目录和容器内目录

2) 编辑宿主机文件/var/webroot/index.html,内容如下:

3)切换到与web2处于同一局域网的proxy主机上,在proxy上访问web2的80端口,可以获取运行在web2上容器提供的web网页。

docker高级用户 docker高级教程_docker_28