3.1 構(gòu)建自定義鏡像的意義與應(yīng)用場景
簡介:介紹自定義鏡像的重要性
- docker目前鏡像的制作有倆種方法:
- 基于Docker Commit制作鏡像
- 基于dockerfile制作鏡像肢簿,Dockerfile方式為主流的制作鏡像方式
3.2 Commit構(gòu)建自定義鏡像
簡介:對容器的修改以及保存
- 啟動并進(jìn)入容器:docker run -it centos:7 /bin/bash
- 在/home 路徑下創(chuàng)建xdclass文件夾:mkdir /home/xdclass
- 安裝ifconfig命令:yum -y install net-tools
- 重啟容器起愈,查看容器的xdclass文件夾還在不在:docker restart 67862569d4f7
- 刪除容器,再重新啟動一個(gè)容器進(jìn)入查看有沒有xdclass文件夾:
- docker rm 67862569d4f7 && docker run -it centos:7 /bin/bash
- 構(gòu)建鏡像:
- docker commit 4eb9d14ebb18 mycentos:7
- docker commit -a "XD" -m "mkdir /home/xdclass" 4eb9d14ebb18 mcentos:7
- -a:標(biāo)注作者
- -m:說明注釋
- 查看詳細(xì)信息:docker inspect 180176be1b4c
- 啟動容器:docker run -itd 180176be1b4c /bin/bash
- 進(jìn)入容器查看:docker exec -it 2a4d38eca64f /bin/bash
3.3 核心必備知識之Dockerfile構(gòu)建鏡像實(shí)戰(zhàn)
簡介:Dockerfile構(gòu)建鏡像實(shí)戰(zhàn)
- Dockerfile
# this is a dockerfile
FROM centos:7
MAINTAINER XD 123456@qq.com
RUN echo "正在構(gòu)建鏡像R胝獭L洹!"
WORKDIR /home/xdclass
COPY 123.txt /home/xdclass
RUN yum install -y net-tools
- 構(gòu)建:docker build -t mycentos:v2 .
- 查看:docker images
- 進(jìn)入驗(yàn)證:驗(yàn)證成功
3.4 Docker核心知識之鏡像分層結(jié)構(gòu)剖析
簡介:介紹鏡像的分層結(jié)構(gòu)
使用dockerfile構(gòu)建鏡像的時(shí)候纵菌,每一個(gè)步驟都會生成一個(gè)鏡像ID阐污。
使用docker history命令可以查看docker構(gòu)建鏡像的過程。
- 總結(jié):
- 共享資源
- 對容器的任何改動都是發(fā)生容器層
- 容器層是可寫可讀咱圆,而鏡像層只讀
3.5 不得不掌握的Dockerfile基礎(chǔ)指令
簡介:介紹一些常用的Dockerfile指令
-
FROM
- 基于哪個(gè)鏡像
-
MAINTAINER
- 注明作者
-
COPY
- 復(fù)制文件進(jìn)入鏡像(只能用相對路徑笛辟,不能用絕對路徑)
-
ADD
- 復(fù)制文件進(jìn)入鏡像(假如文件是.tar.gz文件會解壓)
-
WORKDIR:
- 指定工作目錄,假如路徑不存在會創(chuàng)建路徑
-
ENV
- 設(shè)置環(huán)境變量
-
EXPOSE
- 暴露容器端口
-
RUN
- 在構(gòu)建鏡像的時(shí)候執(zhí)行序苏,作用于鏡像層面
-
ENTRYPOINT
- 在容器啟動的時(shí)候執(zhí)行手幢,作用于容器層,dockerfile里有多條時(shí)只允許執(zhí)行最后一條
-
CMD
- 在容器啟動的時(shí)候執(zhí)行忱详,作用于容器層围来,dockerfile里有多條時(shí)只允許執(zhí)行最后一條
- 容器啟動后執(zhí)行默認(rèn)的命令或者參數(shù),允許被修改
-
命令格式:
- shell命令格式:RUN yum install -y net-tools
- exec命令格式:RUN [ "yum","install" ,"-y" ,"net-tools"]
dockerfile
#第一個(gè)
FROM centos:7
RUN echo "images building!"
CMD ["echo","container","starting..."]
ENTRYPOINT ["echo","container","starting P僬觥<嗤浮!"]
#第二個(gè)
FROM centos:7
RUN echo "images building!"
CMD ["echo","containe1r","starting..."]
CMD ["echo","container2","starting..."]
ENTRYPOINT ["echo","container2","starting :剿簟U吐!"]
ENTRYPOINT ["echo","container2","starting E锤啤7嗬恰退腥!"]
#第三個(gè)
FROM centos:7
CMD ["-ef"]
ENTRYPOINT ["ps"]
執(zhí)行第一個(gè)dockerfile,我們會發(fā)現(xiàn)僅執(zhí)行run的時(shí)候出現(xiàn)images building提示再榄,在CMD阅虫、ENTRYPOINT 命令時(shí)候沒有提示。這是因?yàn)閞un命令作用于鏡像層面不跟,CMD颓帝、ENTRYPOINT命令作用于容器層。另外容器啟動的時(shí)候窝革,我們看到了CMD购城、ENTRYPOINT命令的執(zhí)行。
執(zhí)行第二個(gè)dockerfile虐译,如下:
跟執(zhí)行第一個(gè)dockerfile類似瘪板,啟動構(gòu)建的容器:
我們發(fā)現(xiàn)ENTRYPOINT、CMD dockerfile里有多條時(shí)只允許執(zhí)行最后一條漆诽。
執(zhí)行第三個(gè)dockerfile侮攀,過程如下圖所示:
執(zhí)行鏡像:
3.6 實(shí)戰(zhàn)系列之Dockerfile構(gòu)建JAVA網(wǎng)站鏡像
簡介:Dockerfile構(gòu)建java環(huán)境
本地宿主機(jī)配置jdk
vi /etc/profile
export JAVA_HOME=/usr/local/jdk
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
- source /etc/profile
- 檢驗(yàn):java -version
- dockerfile
FROM centos:7
ADD jdk-8u211-linux-x64.tar.gz /usr/local
RUN mv /usr/local/jdk1.8.0_211 /usr/local/jdk
ENV JAVA_HOME=/usr/local/jdk
ENV JRE_HOME=$JAVA_HOME/jre
ENV CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
ENV PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
ADD apache-tomcat-8.5.35.tar.gz /usr/local
RUN mv /usr/local/apache-tomcat-8.5.35 /usr/local/tomcat
EXPOSE 8080
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]
EXPOSE:功能為暴漏容器運(yùn)行時(shí)的監(jiān)聽端口給外部
啟動容器,并掛載目錄:
docker run -itd -p 80:8080 -v /root/test/ROOT:/usr/local/tomcat/webapps/ROOT
mycentos:jdk /bin/bash
- 網(wǎng)頁進(jìn)行訪問驗(yàn)證
3.7 實(shí)戰(zhàn)系列之Dockerfile構(gòu)建nginx鏡像
簡介:Dockerfile構(gòu)建nginx
- dockerfile
FROM centos:7
ADD nginx-1.16.0.tar.gz /usr/local
COPY nginx_install.sh /usr/local
RUN sh /usr/local/nginx_install.sh
EXPOSE 80
安裝nginx的shell腳本
#!/bin/bash
yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-devel
cd /usr/local/nginx-1.16.0
./configure --prefix=/usr/local/nginx && make && make install
-
制作Nginx鏡像:
- docker build -t mycentos:nginx .
-
Nginx鏡像啟動注意
- 在容器里nginx是以daemon方式啟動厢拭,退出容器時(shí)兰英,nginx程序也會隨著停止:
/usr/local/nginx/sbin/nginx - 使用前臺方式永久運(yùn)行:/usr/local/nginx/sbin/nginx -g "daemon off;"
- 在容器里nginx是以daemon方式啟動厢拭,退出容器時(shí)兰英,nginx程序也會隨著停止:
-
檢查驗(yàn)證:
- docker run -itd -p 80:80 mycentos:nginx /usr/local/nginx/sbin/nginx -g "daemon off;"
3.8 實(shí)戰(zhàn)系列之Dockerfile構(gòu)建redis鏡像
簡介:Dockerfile構(gòu)建redis
- 編寫redis編譯安裝shell腳本redis_install.sh
#!/bin/bash
yum install -y gcc gcc-c++ make openssl openssl-devel
cd /home/redis-4.0.9
make && make PREFIX=/usr/local/redis install
mkdir -p /usr/local/redis/conf/
cp /home/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/redis.conf
- 編寫Dockerfile
FROM centos:7
ADD redis-4.0.9.tar.gz /home
COPY redis_install.sh /home
RUN sh /home/redis_install.sh
ENTRYPOINT /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
- 測試redis:
- 啟動容器:docker run -itd -p 6380:6379 mycentos:redis #6380是宿主機(jī)端口,6379是容器的端口
- 進(jìn)入容器:docker exec -it 9b402baeaba7 /bin/bash
- 宿主機(jī)連接redis: /usr/local/redis/bin/redis-cli -p 6380
- 驗(yàn)證:
[root@localhost home]# /usr/local/redis/bin/redis-cli -p 6380
127.0.0.1:6380> set name xdclass
OK
127.0.0.1:6380> get name
"xdclass"
127.0.0.1:6380>
3.9 實(shí)戰(zhàn)系列之docker快速部署mysql數(shù)據(jù)庫并初始化
簡介:Dockerfile快速部署mysql數(shù)據(jù)庫并初始化
-
官方網(wǎng)址:
-
啟動命令:
- docker run --name some-mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -d mysql:5.7
-
進(jìn)入容器命令:
- docker exec -it 4336ae28fbfa env LANG=C.UTF-8 /bin/bash
dockerfile
FROM mysql:5.7
WORKDIR /docker-entrypoint-initdb.d
ENV LANG=C.UTF-8
ADD init.sql .
- 初始化sql語句:
-- 建庫
create database `db_student`;
SET character_set_client = utf8;
use db_student;
-- 建表
drop table if exists `user`;
CREATE TABLE user (
id tinyint(5) zerofill auto_increment not null comment '學(xué)生學(xué)號',
name varchar(20) default null comment '學(xué)生姓名',
age tinyint default null comment '學(xué)生年齡',
class varchar(20) default null comment '學(xué)生班級',
sex char(5) not null comment '學(xué)生性別',
unique key (id)
)engine=innodb charset=utf8;
-- 插入數(shù)據(jù)
insert into user values('1','小明','15','初三','男');
insert into user values('2','小紅','13','初二','女');
insert into user values('3','小東','14','初一','男');
insert into user values('4','小西','12','初二','男');