目录

Life in Flow

知不知,尚矣;不知知,病矣。
不知不知,殆矣。

X

Docker自定义镜像

自定义镜像的常见方式

  • 基于 Docker Commit 制作镜像
  • 基于 dockerfile 制作镜像,Dockerfile 方式为主流的制作镜像方式。

镜像的分层结构

  • 多个容器层共享同一个镜像层
  • 对容器的任何改动都是发生在容器层
  • 容器层是可写可读,而镜像层只读
  • class : object
 1[root@master ~]# docker history mycentos:v2
 2IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
 36179c08f8204        17 minutes ago      /bin/sh -c yum install -y net-tools             100MB               
 411f381c5e640        17 minutes ago      /bin/sh -c #(nop) COPY file:8eda00bfac1c94e7…   0B                  
 525cc0d469386        17 minutes ago      /bin/sh -c #(nop) WORKDIR /home/soulboy         0B                  
 6a6624f371c02        17 minutes ago      /bin/sh -c echo "正在构建镜像!!!"                     0B                  
 73059d7b5e9eb        17 minutes ago      /bin/sh -c #(nop)  MAINTAINER XD 123456@qq.c…   0B                  
 85e35e350aded        3 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B                  
 9<missing>           3 weeks ago         /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B                  
10<missing>           3 weeks ago         /bin/sh -c #(nop) ADD file:45a381049c52b5664…   203MB       

基于 Docker Commit 制作镜像

 1# 对容器进行内容变更
 2[root@master ~]# docker run -it centos:7 /bin/bash
 3[root@fef3ea9fbcf0 /]# mkdir /home/soulboy 
 4[root@fef3ea9fbcf0 /]# yum install -y net-tools
 5
 6# 对修改进行保存
 7[root@master ~]# docker commit -a "dudulong" -m "mkdir&&net-tools" fef3ea9fbcf0 mycentos:v1
 8sha256:78cf18af254e37d88164e96db0b25386922ff38b868a28b897c4559a1095ab51
 9
10# 删除当前容器
11[root@master ~]# docker rm -f fef3ea9fbcf0
12fef3ea9fbcf0
13
14# 机遇新镜像(commit生成的)启动容器
15[root@master ~]# docker run -itd mycentos:v1 /bin/bash
1607c23a9cbd4f130bd621262b87ecb0966476a487582074175393cd2a89023587
17
18# 进入新容器(验证)
19[root@master ~]# docker exec -it 07c23a9cbd4f130bd621262b87ecb0966476a487582074175393cd2a89023587 /bin/bas
20[root@07c23a9cbd4f /]# ls /home/       
21soulboy
22[root@07c23a9cbd4f /]# ifconfig 
23eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
24        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
25        ether 02:42🇦🇨11:00:02  txqueuelen 0  (Ethernet)
26        RX packets 12  bytes 976 (976.0 B)
27        RX errors 0  dropped 0  overruns 0  frame 0
28        TX packets 0  bytes 0 (0.0 B)
29        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
30
31lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
32        inet 127.0.0.1  netmask 255.0.0.0
33        loop  txqueuelen 1000  (Local Loopback)
34        RX packets 0  bytes 0 (0.0 B)
35        RX errors 0  dropped 0  overruns 0  frame 0
36        TX packets 0  bytes 0 (0.0 B)
37        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

基于 dockerfile 制作镜像

dockerfile

 1# this is a dockerfile
 2FROM centos:7
 3MAINTAINER XD 123456@qq.com
 4RUN echo "正在构建镜像!!!"
 5WORKDIR /home/soulboy
 6COPY 123.txt /home/soulboy
 7RUN yum install -y net-tools
 8
 9
10# 基于~~~~dockerfile构建镜像  
11[root@master ~]# docker build -t mycentos:v2 .
12Complete!
13Removing intermediate container 4c77f4b0473c
14 ---> 6179c08f8204
15Successfully built 6179c08f8204
16Successfully tagged mycentos:v2
17
18# 验证镜像v2
19[root@master ~]# docker run -it mycentos:v2 /bin/bash
20[root@18e750313a81 soulboy]# pwd		#进入容器就自动切换到指定工作目录下
21/home/soulboy
22[root@18e750313a81 soulboy]# ls	#发现已经把目标文件复制到指定路径下
23123.txt

Dockerfile 基础指令

 1FROM	#哪个镜像
 2MAINTAINER	#作者
 3COPY	#后面跟相对路径;不能是绝对路径
 4ADD	#复制+解压
 5WORKDIR	#指定工作目录
 6ENV	#设置环境变量
 7EXPOSE	#暴露容器端口
 8RUN	#执行命令:作用于镜像层(镜像构建中)
 9CMD	#在容器启动的时候执行,作用于容器层,dockerfifile里有多条时只允许执行最后一条;容器启动后执行默认的命令或者参数,允许被修改。CMD本身也可以作为参数,传递给ENTRYPOINT命令后面。前提是ENTRYPOINT采用的是exec格式的命令。
10ENTRYPOINT	#在容器启动的时候执行,作用于容器层,dockerfifile里有多条时只允许执行最后一条,ENTRYPOINT优于CMD,docker run后面的参数可以覆盖 CMD后面的命令。
11命令格式:
12	shell命令格式:RUN yum install -y net-tools
13	exec命令格式:RUN ["yum","install","-y","net-tools"]

构建 JDK&Tomcat 镜像

 1[root@master java]# ls
 2apache-tomcat-8.5.35.tar.gz  dockerfile  jdk-8u211-linux-x64.tar.gz
 3
 4# dockerfile文件如下
 5[root@master java]# cat dockerfile 
 6FROM centos:7 
 7ADD jdk-8u211-linux-x64.tar.gz /usr/local 
 8RUN mv /usr/local/jdk1.8.0_211 /usr/local/jdk 
 9ENV JAVA_HOME=/usr/local/jdk 
10ENV JRE_HOME=$JAVA_HOME/jre 
11ENV CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH 
12ENV PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH 
13ADD apache-tomcat-8.5.35.tar.gz /usr/local 
14RUN mv /usr/local/apache-tomcat-8.5.35 /usr/local/tomcat 
15EXPOSE 8080 
16ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]
17
18# 构建镜像过程
19[root@master java]# docker build -t mycentos:jdk .
20Successfully built c41cd3fd2268
21Successfully tagged mycentos:jdk
22
23# 启动容器(基于mycentos:jdk)
24[root@master java]# mkdir /docker/java/root 
25[root@master java]# echo "hello world!" > /docker/java/root/index.html
26[root@master java]# docker run -itd -p 80:8080 -v /docker/java/root:/usr/local/tomcat/webapps/ROOT mycentos:jdk /bin/bash
27555a56919263ee51256d98e35dea8a998d393caa684bc59e508db0e1176b25af
28
29# 访问http://192.168.31.201/
30hello world!

构建 Nginx 镜像

 1# 文件如下
 2[root@master nginx]# ls
 3dockerfile  nginx-1.16.0.tar.gz  nginx_install.sh
 4
 5# 安装nginx的shell脚本
 6[root@master nginx]# cat nginx_install.sh 
 7#!/bin/bash
 8yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-devel 
 9cd /usr/local/nginx-1.16.0
10./configure --prefix=/usr/local/nginx && make && make install
11
12# dockerfile
13[root@master nginx]# cat dockerfile 
14FROM centos:7
15ADD nginx-1.16.0.tar.gz /usr/local 
16COPY nginx_install.sh /usr/local 
17RUN sh /usr/local/nginx_install.sh 
18EXPOSE 80
19
20# 生成Nginx镜像
21[root@master nginx]# docker build -t mycentos:nginx .
22 ---> b9d019985162
23Successfully built b9d019985162
24Successfully tagged mycentos:nginx
25
26# 启动容器(在容器种nginx是以daeon方式启动,退出容器时,nginx程序也会随之停止,使用前台永久运行 /usr/local/nginx/sbin/nginx -g "daemon off;")
27docker run -itd -p 80:80 mycentos:nginx /usr/local/nginx/sbin/nginx -g "daemon off;"
28[root@master nginx]# docker run -itd -p 80:80 mycentos:nginx /usr/local/nginx/sbin/nginx -g "daemon off;"
292cea91ffd31aea999fec8f832a6ea27dc3aee690debc3904c727ca2f52c6a124
30
31# 访问http://192.168.31.201/
32	Welcome to nginx!

构建 Redis 镜像

 1# 文件结构如下
 2[root@master redis2]# ls
 3dockerfile  redis-4.0.9.tar.gz  redis_install.sh
 4
 5# redis安装脚本
 6[root@master redis2]# cat redis_install.sh 
 7#!/bin/bash 
 8yum install -y gcc gcc-c++ make openssl openssl-devel 
 9cd /home/redis-4.0.9 
10make && make PREFIX=/usr/local/redis install 
11mkdir -p /usr/local/redis/conf/ 
12cp /home/redis-4.0.9/redis.conf /usr/local/redis/conf/ 
13sed -i '69s/127.0.0.1/0.0.0.0/' /usr/local/redis/conf/redis.conf 
14sed -i '88s/protected-mode yes/protected-mode no/' /usr/local/redis/conf/redis.conf
15
16# dockerfile
17[root@master redis2]# cat dockerfile 
18FROM centos:7 
19ADD redis-4.0.9.tar.gz /home 
20COPY redis_install.sh /home 
21RUN sh /home/redis_install.sh 
22ENTRYPOINT /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
23
24# 制作镜像
25[root@master redis2]# docker build -t mycentos:redis .
26 ---> 012fd0093f26
27Successfully built 012fd0093f26
28Successfully tagged mycentos:redis
29
30# 启动容器
31[root@master redis2]# docker run -itd -p 6380:6379 mycentos:redis #6380是宿主机端口,6379是容器的端口
32
33# 进入容器
34[root@master redis2]# docker exec -it a42f1207 /bin/bash
35
36# 使用redis-cli远程连接redis
37[root@master redis2]# /usr/local/redis/bin/redis-cli -p 6380

快速部署 MySQL 数据库并初始化(构建 MySQL 镜像)

hub.docker.mysql

 1# 拉取镜像
 2[root@master redis2]# docker pull mysql:5.7
 3
 4# 目录结构
 5[root@master mysql]# ls
 6dockerfile  init.sql
 7
 8# 初始化sql语句
 9[root@master mysql]# cat init.sql 
10-- 建库 create database `db_student`; 
11SET character_set_client = utf8; 
12use db_student; 
13-- 建表 
14drop table if exists `user`; 
15CREATE TABLE user ( 
16	id tinyint(5) zerofill auto_increment not null comment '学生学号', 
17	name varchar(20) default null comment '学生姓名', 
18	age tinyint default null comment '学生年龄', 
19	class varchar(20) default null comment '学生班级', 
20	sex char(5) not null comment '学生性别', 
21	unique key (id) 
22)engine=innodb charset=utf8; 
23-- 插入数据 
24insert into user values('1','小明','15','初三','男'); 
25insert into user values('2','小红','13','初二','女'); 
26insert into user values('3','小东','14','初一','男');
27
28# dockerfile
29[root@master mysql]# cat dockerfile 
30FROM mysql:5.7 
31WORKDIR /docker-entrypoint-initdb.d 
32ENV LANG=C.UTF-8 
33ADD init.sql .
34
35# 构建镜像
36[root@master mysql]# docker build -t my-mysql:5.7 .
37 ---> 8921287b2399
38Successfully built 8921287b2399
39Successfully tagged my-mysql:5.7
40
41# 启动容器
42[root@master mysql]# docker run --name some-mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123 -d my-mysql:5.7 
43da00b587b821dfa76bdbe7ef250a44d7fd5aa4d9f75d1e6d05a92c4965a04895
44
45# 进入容器验证是否初始化数据库
46[root@master mysql]# docker exec -it some-mysql /bin/bash
47root@34370a9c7279:/docker-entrypoint-initdb.d# mysql -uroot -p123
48mysql: [Warning] Using a password on the command line interface can be insecure.
49Welcome to the MySQL monitor.  Commands end with ; or \g.
50Your MySQL connection id is 4
51Server version: 5.7.28 MySQL Community Server (GPL)
52
53Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
54
55Oracle is a registered trademark of Oracle Corporation and/or its
56affiliates. Other names may be trademarks of their respective
57owners.
58
59Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
60
61mysql> show databases;
62+--------------------+
63| Database           |
64+--------------------+
65| information_schema |
66| db_student         |
67| mysql              |
68| performance_schema |
69| sys                |
70+--------------------+
715 rows in set (0.00 sec)
72
73mysql> use db_student;
74Reading table information for completion of table and column names
75You can turn off this feature to get a quicker startup with -A
76
77Database changed
78mysql> select * from user;
79+-------+--------+------+--------+-----+
80| id    | name   | age  | class  | sex |
81+-------+--------+------+--------+-----+
82| 00001 | 小明   |   15 | 初三   ||
83| 00002 | 小红   |   13 | 初二   ||
84| 00003 | 小东   |   14 | 初一   ||
85+-------+--------+------+--------+-----+
863 rows in set (0.00 sec)

作者:Soulboy