Docker自定义镜像实战
1. docker镜像制作的方法
- 基于Docker Commit制作
- 基于dockerfile制作,该方式为主流的制作镜像方式
2. Commit方式构建自定义镜像
- 对容器修改及保存
-
启动并进入容器 docker run -it centos:7 /bin/bash
-
再home下创建xd : mkdir xd
安装ifconfig命令: yum -y install net-tools
-
重启容器,看xd文件夹还在否:
docker restart 2675c91a2007
xd文件夹仍在 -
删除容器,再启动一个容器看有无xd文件夹
docker stop 2675c91a2007
docker rm 2675c91a2007
docker run -it centos:7 /bin/bash
xd文件夹不存在
- 构建镜像
- 原容器创建xd文件夹
[root@slave1 ~]# docker exec -it 08f6849f45ff /bin/bash
[root@08f6849f45ff /]# cd /home/
[root@08f6849f45ff home]# ls
[root@08f6849f45ff home]# mkdir xd
[root@08f6849f45ff home]# ls
xd
-
docker commit 08f6849f45ff mycento:7
-
docker commit -a “XD” -m “mkdir /home/xd” 08f6849f45ff mycento:7
-a : 标注作者
-m : 注释
查看详细说明 docker inspect 08f6849f45ff -
查看镜像: docker images
[root@slave1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycento 7 db204e9de691 2 minutes ago 204MB
<none> <none> 04ab49404f3c 6 minutes ago 204MB
<none> <none> 62a20aa04ec0 8 minutes ago 204MB
centos 7 8652b9f0cb4c 3 months ago 204MB
- 删除原容器: docker rmi 08f6849f45ff
[root@slave1 ~]# docker stop 08f6849f45ff
08f6849f45ff
[root@slave1 ~]# docker rm 08f6849f45ff
08f6849f45ff
- 启动镜像对应的容器
[root@slave1 ~]# docker run -itd mycento:7 /bin/bash
73de9091f862b113057f8c9bddc4686246a9adbbd12232cae4ad7078112ce4f1
[root@slave1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
73de9091f862 mycento:7 "/bin/bash" 6 seconds ago Up 4 seconds happy_wing
- 进入容器
[root@slave1 ~]# docker exec -it 73de9091f862 /bin/bash
[root@73de9091f862 /]# cd /home
[root@73de9091f862 home]# ls
xd
xd文件存在于镜像
3. Dockerfile构建镜像实战
-
构建一个dockerfile的文本
- 下面内容为dockerfile文本的内容
FROM centos:7 MAINTAINER XD ss@qq.com RUN echo "正在构建镜像!!!" WORKDIR /opt/xd/ COPY ee.txt /home/xd [root@slave1 xd]# touch dockerfile [root@slave1 xd]# ls 44.txt 456.txt dockerfile ee.txt [root@slave1 xd]# ls 44.txt 456.txt dockerfile ee.txt [root@slave1 xd]# vi dockerfile [root@slave1 xd]# pwd /opt/xd
- dockerfile和ee.txt都在/opt/xd目录
-
构建镜像: docker build -t mycento:v2 .(.表示路径)
[root@slave1 xd]# docker build -t mycentos:v3 .
Sending build context to Docker daemon 5.12kB
Step 1/5 : FROM centos:7
---> 8652b9f0cb4c
Step 2/5 : MAINTAINER XD ss@qq.com
---> Running in 8531aa86fb10
Removing intermediate container 8531aa86fb10
---> 54489a9b0f44
Step 3/5 : RUN echo "正在构建镜像!!!"
---> Running in f864bec988d3
正在构建镜像!!!
Removing intermediate container f864bec988d3
---> 249a3773ad55
Step 4/5 : WORKDIR /opt/xd/
---> Running in 3bb75052b600
Removing intermediate container 3bb75052b600
---> 23204322d99c
Step 5/5 : COPY ee.txt /opt/xd
---> 73fd30777a3d
Successfully built 73fd30777a3d
Successfully tagged mycentos:v3
-
查看镜像:
[root@slave1 xd]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mycentos v3 73fd30777a3d About a minute ago 204MB mycento 7 db204e9de691 22 hours ago 204MB centos 7 8652b9f0cb4c 3 months ago 204MB
-
验证
[root@slave1 xd]# docker run -it mycentos:v3 /bin/bash [root@e81b4d2d0099 xd]# ll total 4 -rw-r--r--. 1 root root 9 Feb 9 01:09 ee.txt
- ee.txt 存在 /opt/xd目录下
4. 镜像分层结构
- 查看分层
[root@slave1 xd]# docker history mycentos:v3
IMAGE CREATED CREATED BY SIZE COMMENT
73fd30777a3d 2 hours ago /bin/sh -c #(nop) COPY file:b0e33e0533c5cf9e… 9B
23204322d99c 2 hours ago /bin/sh -c #(nop) WORKDIR /opt/xd/ 0B
249a3773ad55 2 hours ago /bin/sh -c echo "正在构建镜像!!!" 0B
54489a9b0f44 2 hours ago /bin/sh -c #(nop) MAINTAINER XD ss@qq.com 0B
8652b9f0cb4c 3 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 3 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 3 months ago /bin/sh -c #(nop) ADD file:b3ebbe8bd304723d4… 204MB
-
启动镜像的时候,一个新的可写层会加载到镜像的顶部。这一层通常称为“容器层”, 之下是“镜像层”。
上述imageid均是镜像层id
-
容器层可以读写,容器所有发生文件变更写都发生在这一层。镜像层read-only,只允许读取
- 总结
- 共享资源
- 对容器的任何改动都是发生在容器层
- 容器层是可写可读,镜像层只读
5. 常用的dockerfile指令
-
from 基于哪个镜像
-
MAINTAINER 作者
-
COPY 复制文件进入镜像(只能用相对路径,不能用绝对路径)
-
ADD 复制文件进入镜像(压缩包会解压)
-
WORKDIR 指定复制文件的工作目录,不存在会创建路径
-
ENV 设置环境变量
-
EXPOSE 暴露容器端口
-
RUN 构建镜像的时候执行其后的命令,作用于镜像层面
-
ENTRYPOINT 在容器启动的时候执行,作用于容器层,dockerfile里有多条时只执行最后一条
-
CMD
-
在容器启动时执行,作用于容器层,dockerfile里有多条时只执行最后一条
-
容器启动后执行默认的命令或参数,允许被修改
-
命令格式:
- shell命令格式:RUN yum install -y net-tools
- exec命令格式:RUN [“yum”,“install”,"-y",“net-tools”
-
6. 构建JAVA网站镜像
-
宿主机jdk配置
export JAVA_HOME=/opt/jdk1.8.0_251 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
-
编写dockerfile
FROM centos:7
WORKDIR /opt/
ADD jdk-8u251-linux-x64.tar.gz /opt
ENV JAVA_HOME=/opt/jdk1.8.0_251
ENV PATH=$JAVA_HOME/bin:$PATH
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ADD apache-tomcat-8.0.52.tar /opt
RUN mv /opt/apache-tomcat-8.0.52 /opt/tomcat8
EXPOSE 8080
ENTRYPOINT ["/opt/tomcat8/bin/catalina.sh","run"]
-- 创建镜像
[root@slave1 opt]# docker build -t mycentos:v4 .
Sending build context to Docker daemon 2.183GB
Step 1/9 : FROM centos:7
---> 8652b9f0cb4c
Step 2/9 : ADD jdk-8u251-linux-x64.tar.gz /opt
---> ea59e2b563f0
Step 3/9 : ENV JAVA_HOME=/opt/jdk1.8.0_251
---> Running in a4b4d2f20045
Removing intermediate container a4b4d2f20045
---> d4cd62a72bd6
Step 4/9 : ENV PATH=$JAVA_HOME/bin:$PATH
---> Running in 802aa9ba03b6
Removing intermediate container 802aa9ba03b6
---> d206ac9a3cdf
Step 5/9 : ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
---> Running in 91e0226a6e5a
Removing intermediate container 91e0226a6e5a
---> 8158340bc0f5
Step 6/9 : ADD apache-tomcat-8.0.52.tar /opt
---> 5c2f78855b3e
Step 7/9 : RUN mv /opt/apache-tomcat-8.0.52 /opt/tomcat8
---> Running in 3f58fb59e373
Removing intermediate container 3f58fb59e373
---> dbb92f38bb8f
Step 8/9 : EXPOSE 8080
---> Running in 94fbb09d64a0
Removing intermediate container 94fbb09d64a0
---> e84623d5659d
Step 9/9 : ENTRYPOINT ["/opt/tomcat8/bin/catalina.sh","run"]
---> Running in 746cb5bb32f5
Removing intermediate container 746cb5bb32f5
---> a499a7e02efd
Successfully built a499a7e02efd
Successfully tagged mycentos:v4
-
宿主机创建目录,宿主机文件夹挂载到容器里
[root@slave1 opt]# mkdir dockerweb [root@slave1 opt]# docker run -itd -p 80:8080 -v /dockerweb:/opt/tomcat8/webapps/ROOT mycentos:v4 /bin/bash erweb [root@slave1 dockerweb]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b5aa0edc1c11 mycentos:v4 "/opt/tomcat8/bin/ca…" 2 minutes ago Up 2 minutes 0.0.0.0:80->8080/tcp priceless_nightingale e81b4d2d0099 mycentos:v3 "/bin/bash" 6 hours ago Up 6 hours romantic_heyrovsky [root@slave1 dockerweb]#
-
进入镜像,在镜像tomcat8/webapps/ROOT/下创建文件index.html
[root@slave1 dockerweb]# docker exec -it 34409c58771f /bin/bash
[root@34409c58771f /]# cd /opt/tomcat8/webapps/ROOT/
[root@34409c58771f ROOT]# ls
index.html
- 宿主机网页验证
http://192.168.250.130:8181/index.html
7. dockerfile构建redis镜像
- 编写redis安装的shell脚本 /opt/redis_install.sh
#! /bin/bash
yum install -y gcc gcc-c++ make openssl openssl-devel
cd /opt/xd/redis-4.0.9
make && make PREFIX=/usr/local/redis install
mkdir -p /usr/local/redis/conf/
cp /opt/xd/redis-4.0.9/redis.conf /usr/local/redis/conf/
sed -i '69s/127.0.0.1/0.0.0.0/' /usr/local/redis/conf/redis.conf
sed -i '88s/protected-mode yes/protected-mode no/' /usr/local/redis/conf/
- 编写dockerfile
FROM centos:7
ADD redis-4.0.9.tar.gz /opt/xd
COPY redis_install.sh /opt/xd
RUN sh /opt/xd/redis_install.sh
ENTRYPOINT /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
-
测试redis
- 构建 docker build -t mycentos:redis .
- 启动容器 docker run -itd -p 6380:6379 mycentos:redis
- 进入容器 docker exec -it xxxxx /bin/bash
- 宿主机连接redis: /usr/local/redis/bin/redis-cli -p 6380
8. 快速部署mysql数据库并初始化
-
下载mysql5.7镜像
- docker pull mysql:5.7
-
进入hub.docker.com官网
-
启动mysql实例的代码
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:tag- some-mysql is the name you want to assign to your container
- my-secret-pw is the password to be set for the MySQL root user
- tag is the tag specifying the MySQL version you want
-
进入容器命令
[root@slave1 ~]# docker run --name some-mysql -p 3356:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7 c6d139793ef1bf6d3d4f22c31dfa4840084e7745bb833890bf4b076831bdf8a6 [root@slave1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c6d139793ef1 mysql:5.7 "docker-entrypoint.s…" 18 seconds ago Up 16 seconds 33060/tcp, 0.0.0.0:3356->3306/tcp some-mysql 34409c58771f mycentos:v4 "/opt/tomcat8/bin/ca…" 44 hours ago Up 44 hours 0.0.0.0:8181->8080/tcp bold_solomon [root@slave1 ~]# docker exec -it c6d139793ef1 env LANG=C.UTF-8/bin/bash root@c6d139793ef1:/# mysql -uroot -proot root@c6d139793ef1:/# ls -lrt total 4 drwxr-xr-x. 2 root root 6 Nov 22 12:37 home drwxr-xr-x. 2 root root 6 Nov 22 12:37 boot drwxr-xr-x. 1 root root 41 Jan 11 00:00 var drwxr-xr-x. 1 root root 19 Jan 11 00:00 usr drwxr-xr-x. 2 root root 6 Jan 11 00:00 srv drwxr-xr-x. 2 root root 4096 Jan 11 00:00 sbin drwxr-xr-x. 2 root root 6 Jan 11 00:00 opt drwxr-xr-x. 2 root root 6 Jan 11 00:00 mnt drwxr-xr-x. 2 root root 6 Jan 11 00:00 media drwxr-xr-x. 2 root root 34 Jan 11 00:00 lib64 drwxr-xr-x. 1 root root 45 Jan 12 10:10 lib drwxr-xr-x. 2 root root 6 Jan 12 10:11 docker-entrypoint-initdb.d drwxr-xr-x. 1 root root 19 Jan 18 23:26 bin drwxr-xr-x. 1 root root 20 Jan 18 23:26 run lrwxrwxrwx. 1 root root 34 Jan 18 23:26 entrypoint.sh -> usr/local/bin/docker-entrypoint.sh dr-xr-xr-x. 13 root root 0 Feb 24 01:38 sys drwxr-xr-x. 1 root root 66 Feb 26 06:10 etc dr-xr-xr-x. 130 root root 0 Feb 26 06:10 proc drwxr-xr-x. 5 root root 340 Feb 26 06:10 dev drwxrwxrwt. 1 root root 6 Feb 26 06:10 tmp drwx------. 1 root root 28 Feb 26 06:15 root
-
-
docker-entrypoint-initdb.d 用来初始化数据库
-
新建dockerfile初始化实践
-
dockerfile
FROM mysql:5.7 WORKDIR /docker-entrypoint-initdb.d ENV LANG=C.UTF-8 ADD init.sql .
-
init.sql 自行随便编写
a. 构建镜像
[root@slave1 xd]# docker build -t mysql:5.7 .
Sending build context to Docker daemon 6.656kB
Step 1/4 : FROM mysql:5.7
---> a70d36bc331a
Step 2/4 : WORKDIR /docker-entrypoint-initdb.d
---> Running in eb21b512e98e
Removing intermediate container eb21b512e98e
---> faa10f1e4e62
Step 3/4 : ENV LANG=C.UTF-8
---> Running in 2b5563d18aef
Removing intermediate container 2b5563d18aef
---> 53fdd47fa9ba
Step 4/4 : ADD init.sql .
---> 24c58894bb32
Successfully built 24c58894bb32
Successfully tagged mysql:5.7
[root@slave1 xd]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 24c58894bb32 6 seconds ago 449MB
b.运行并进入容器
[root@slave1 xd]# docker run --name some-mysql -p 3356:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
fba20c2a1349867f16e51a913e3881ab172f05454ed8d1de796eac44822df48e
[root@slave1 xd]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fba20c2a1349 mysql:5.7 "docker-entrypoint.s…" 6 seconds ago Up 4 seconds 33060/tcp, 0.0.0.0:3356->3306/tcp some-mysql
34409c58771f mycentos:v4 "/opt/tomcat8/bin/ca…" 45 hours ago Up 45 hours 0.0.0.0:8181->8080/tcp bold_solomon
[root@slave1 xd]# docker exec -it fba20c2a1349 /bin/bash
root@fba20c2a1349:/docker-entrypoint-initdb.d# mysql -uroot -proot
c.验证容器是否将数据库初始化到库
mysql> use db_student;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from user;
+-------+--------+------+--------+-----+
| id | name | age | class | sex |
+-------+--------+------+--------+-----+
| 00001 | 小明 | 15 | 初三 | 男 |
| 00002 | 小红 | 13 | 初二 | 女 |
| 00003 | 小东 | 14 | 初一 | 男 |
+-------+--------+------+--------+-----+
3 rows in set (0.00 sec)
9. 制作nginx镜像
-
nginx_install.sh 脚本编写
[root@slave1 xd]# cat nginx_install.sh #!/bin/bash yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-devel cd /usr/local/nginx-1.16.1 ./configure --prefix=/usr/local/nginx && make && make install
-
dockerfile编写
[root@slave1 xd]# cat dockerfile
FROM centos:7
ADD nginx-1.16.1.tar.gz /usr/local
COPY nginx_install.sh /usr/local
RUN sh /usr/local/nginx_install.sh
EXPOSE 80
- 制作镜像
docker build -t mycentos:nginx
-
注意事项
-
在容器里nginx是以daemon方式启动,退出时,nginx 程序也会随之停止
-
使用前台方式永久运行:/usr/local/nginx/sbin/nginx -g “daemon off;”
-
-
检查验证
docker run -itd -p 80:80 mycentos:nginx /usr/local/nginx/sbin/nginx -g “daemon off;”
10. 分布式文件存储mino容器化部署
-
Docker容器化部署 https://docs.min.io/
-
下载镜像
docker pull minio/minio
-
创建和启动容器
docker run -p 11000:9000 \ --name minio_xd \ -v /opt/xd/mino:/data \ -e "MINIO_ROOT_USER=AKIAIOSFODNN7EXAMPLE" \ -e "MINIO_ROOT_PASSWORD=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" \ minio/minio server /data
-
运行成功
容器存在:
运行成功:
-
-
登录,localhost:11000
用户名:AKIAIOSFODNN7EXAMPLE
密码:wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
11.快速部署nacos
1.docker构建
- docker拉取镜像
docker pull nacos/nacos-server
- 查看镜像
docker images
- 启动Nacos
docker run --env MODE=standalone --name xdclass-nacos -d -p 8848:8848 nacos/nacos-server
//查看日志
docker logs -f
- 访问Nacos(记得开放阿里云的网络安全组)
http://公网ip:8848/nacos
# 登录密码默认nacos/nacos
2.Nacos注册中心配置mysql持久化
nacos数据库脚本
- 导入数据库脚本(本章本集资料里面)
- 新增一个用户 nacos/nacos
INSERT INTO `users` (`username`, `password`, `enabled`)
VALUES
('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', 1);
-
mysql最好使用5.7版本(业界用的比较多,稳定)
-
启动命令
docker run -d \
-e MODE=standalone \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.250.130 \
-e MYSQL_SERVICE_PORT=3356 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=root \
-e MYSQL_SERVICE_DB_NAME=cloud_nacos \
-p 8848:8848 \
--restart=always \
--name nacos \
nacos/nacos-server
- 访问(大家改成自己的ip)
- http://192.168.250.130:8848/nacos
12. 安装RabbitMq
#拉取镜像
docker pull rabbitmq:3.8.12-management-alpine
## 进入容器
docker run -d --hostname rabbit_host1 --name xd_rabbit -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=password -p 15672:15672 -p 5672:5672 rabbitmq:3.8.12-management-alpine
#介绍
-d 以守护进程方式在后台运行
-p 15672:15672 management 界面管理访问端口
-p 5672:5672 amqp 访问端口
--name:指定容器名
--hostname:设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts,作为容器主机IP的别名,并且将显示在容器的bash中
-
注意
- Linux服务器检查防火墙是否关闭
- 云服务器检查网络安全组是否开放端口
CentOS 7 以上默认使用的是firewall作为防火墙 查看防火墙状态 firewall-cmd --state 停止firewall systemctl stop firewalld.service 禁止firewall开机启动 systemctl disable firewalld.service