环境准备
准备三台虚拟机及其分别设置对应的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 **
** 3)运行这个自定义镜像,并进行测试:**
** 3) 设置容器默认启动命令 **
** a) 制作一个镜像,用这个镜像启动容器后,服务为python **
新建一个目录 docker1,并且切换到这个目录中,编辑一个Dockerfile文件,文件内容如下:
FROM centos7.9:latest # 指定基础镜像
CMD ["/usr/bin/python"] # 指定容器启动时使用的默认命令
然后执行命令:docker build -t centos:python .
用这个自定义镜像启动一个容器:docker run -it centos:python
此镜像启动的容器,直接进入了python环境
** 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 .
用新创建的镜像启动一个容器,并在宿主机上用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 .创建一个新的镜像。
用刚才新创建的镜像启动一个容器,然后在宿主机上用curl命令访问这个容器的web服务,访问成功。
** 4) 制作一个镜像,用这个镜像启动容器后,直接启动sshd和apache服务 **
以centos:sshd镜像为基础,再构建一个httpd服务的镜像
新建一个目录docker3,切换到这个目录下,在这个新目录中新建一个index.html文件,其内容如下:
编辑一个start.sh文件,内容如下,并且用chmod +x start.sh设置这个文件的执行权限:
编译用于创建新镜像的Dockerfile文件,内容如下:
用上面的Dockerfile文件创建新的镜像centos:sshd_httpd:
用以上的镜像启动一个容器,并验证其sshd和httpd服务,都能成功访问:
进入容器内部,查看其监听端口与对应的进程:
自定义仓库
环境准备
**1、 安装私有仓库(服务端) **
在proxy(192.168.200.2)上创建私有镜像仓库:yum install docker-distribution
2、启动私有仓库,并设置开机自启
启动服务后,其监听端口是5000:
查看当前镜像仓库中的数据,当前仓库中没有镜像:
3、仓库配置文件及数据存储路径
1) /etc/docker-distribution/registry/config.yml
2) /var/lib/registry
4、修改客户端配置
在客户端(web1,web2)上修改配置文件:
- 在/etc/docker/目录下新建一个文件:daemon.json,然后添加如下内容,指定私有仓库地址和用非安全方式(http)
- 重启客户端docker程序:systemctl restart docker
3)在客户端为上传镜像打上标签: docker tag 本地镜像名:标签 <上传私有仓库地址:端口>/镜像名:标签
上传镜像到私有仓库
用法:docker push <本地镜像名[格式:私有仓库地址:端口/镜像名:标签]>
检查:查看私有仓库中所有仓库以及指定仓库中所有镜像:
所有仓库:curl http://192.168.200.2:5000/v2/_catalog
指定仓库下所有镜像:curl http://192.168.200.2:5000/v2/<仓库名>/tags/list
在web1上用私有仓库中的镜像启动一个容器,并进行测试:
1) 复制web2上配置文件到web1
2) 重启docker
3) 以私有仓库中镜像启动一个容器
4)进行web和ssh测试
删除私有仓库中的镜像
** 准备工作 **
编辑/etc/docker-distribution/registry/config.yml,内容如下:
** 在客户端操作 **
- 先上传一个本地镜像到私有仓库
2)查看私有仓库中的镜像,多了一个lastest标签
3)查看私有仓库中centos:lastest镜像的sha码
4)删除私有仓库中centos:latest标签 - ** 在proxy上进行垃圾回收 **
** 将真实机目录挂载到容器中提供持久化存储: **
1)目录不存在就自动创建
2)目录存在就直接覆盖掉
** 演示映射本地目录到容器中: **
1) 在主机上新建一个目录/var/webroot,在此目录中新建一个index.html文件,内容如下:
2) 在启动这个容器时,加上-v参数指定映射到<容器内目录>的<主机目录>
3) 访问提供web服务的容器,内容就是主机目录/var/webroot/下的index.html
1)新建子网: docker network create --subnet=10.10.10.0/24 docker1
2)使用自定义网桥,启动容器:
在启动命令中使用–network指定容器要连接的网桥
1) 默认容器可以访问外网
2)外网的主机不可以访问容器内的资源
3)容器的特征是把属组机变成对应的服务
演示:
1)在启动容器时,用-p选项绑定宿主机端口和容器内端口,-v绑定宿主机目录和容器内目录
2) 编辑宿主机文件/var/webroot/index.html,内容如下:
3)切换到与web2处于同一局域网的proxy主机上,在proxy上访问web2的80端口,可以获取运行在web2上容器提供的web网页。