Docker部署
MySQL部署
在Docker容器中部署MySQL,并通過外部MySQL客戶端去操作MySQL。
docker容器軟件部署步驟
1 搜索鏡像;2 拉取鏡像;3 創(chuàng)建容器;4 操作容器中的MySQL
注意
容器內(nèi)的網(wǎng)絡(luò)服務(wù)和外部機(jī)器(客戶端)是不能直接進(jìn)行通信的。
外部機(jī)器和宿主機(jī)器可以直接進(jìn)行通信。
當(dāng)容器中的網(wǎng)路服務(wù)需要被外部機(jī)器訪問時(shí),可以將容器中提供服務(wù)的端口映射到宿主機(jī)的端口上,外部機(jī)器訪問宿主機(jī)的該端口,從而間接的訪問容器的服務(wù)。(3306容器端口映射到宿主機(jī)的3307端口 訪問3307即訪問3306實(shí)體容器) ---這種方法解決容器和外部機(jī)器不能直接通信的問題,叫做端口映射
#搜索鏡像
docker search mysql
#拉取鏡像
docker pull mysql:5.6
#創(chuàng)建容器 設(shè)置端口映射 目錄映射
#在root目錄下創(chuàng)建MySQL目錄用于存儲(chǔ)MySQL數(shù)據(jù)信息
mkdir ~/mysql
cd ~/mysql
#創(chuàng)建容器腳本
docker run -id \ #守護(hù)示創(chuàng)建
-p 3307:3306 \ #容器和外部機(jī)器端口一般選擇一致
--name=c_mysql \ #name
-v $PWD/conf:/etc/mysql/conf.d \ #容器卷配置文件
-v $PWD/logs:/logs \ #容器卷log文件
-v $PWD/data:/var/lib/mysql \ #容器卷data文件
-e MYSQL_ROOT_PASSWORD=123456 \ #env環(huán)境文件 定義環(huán)境變量
mysql:5.6
#進(jìn)入容器
docker exec -it c_mysql /bin/bash
#通過外部機(jī)鏈接容器中的sql
#注意address是宿主機(jī)的ip 端口是宿主機(jī)被映射的端口3306端口
Tomcat部署
搜索和拉取的方式和mysql相似
mkdir tomcat
cd tomcat
#創(chuàng)建容器
docker run -id --name=c_tomcat \
-p 8080:8080 \
-v $PWD:/usr/local/tomcat/webapps \
tomcat
在~/tomcat 路徑下創(chuàng)建一個(gè)test文件夾,在test之下創(chuàng)建一個(gè)index.html文件然后ifconfig指令查看宿主機(jī)ip 可以在地址欄訪問 ip:8080/test/index.html路徑了
NGINX部署
拉取和搜索方式同上;但是NGINX服務(wù)器一般會(huì)有一個(gè)配置文件,因?yàn)闀?huì)有反向代理的需求;
docker run -id --name=c_nginx \
-p 80:80 \
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
-v $PWD/logs:/var/log/nginx \
-v $PWD/html:/usr/share/nginx/html \
nginx
參數(shù):-p80:80 容器的端口映射
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf 將主機(jī)當(dāng)前目錄下的/conf/nginx.conf掛載到容器相應(yīng)的目錄上
Redis部署
搜索和拉取和上述指令一致。
#創(chuàng)建容器
docker run -id --name=c_redis -p 6379:6379 redis:5.0
使用外部機(jī)器連接redis
./redis-cli.exe -h 192.168.1.4 -p 6379
Dockerfile
Docker鏡像原理
問題:
- docker鏡像本質(zhì)是什么呢?
是一個(gè)分層文件系統(tǒng);
- docker中的centos鏡像為什么只有200m,但是centos操作系統(tǒng)需要幾個(gè)g?
centos的iso鏡像文件包含了bootfs和rootfs,而docker鏡像復(fù)用操作系統(tǒng)的bootfs,只有rootfs和其他鏡像層
- docker中tomcat鏡像有500m,但是tomcat安裝包只有70m?
由于docker中鏡像是分層的,tomcat雖然只有70多m,但是它依賴的父鏡像和基礎(chǔ)鏡像,所有整個(gè)對(duì)外暴露的tomcat鏡像大小是由500m
分析:
從操作系統(tǒng)首先入手,其組成部分:
1,進(jìn)程調(diào)度子系統(tǒng);2,進(jìn)程通信子系統(tǒng);3,內(nèi)存管理子系統(tǒng);4,設(shè)備管理子系統(tǒng);5,文件管理子系統(tǒng);6,網(wǎng)絡(luò)通信子系統(tǒng);7,作業(yè)控制子系統(tǒng)。
Linux文件系統(tǒng)由bootfs和rootfs兩部分組成
- Bootfs:包含BootLoader(引導(dǎo)加載程序)和kernel(內(nèi)核心)
- rootfs: root文件系統(tǒng),包含的就是典型的Linux系統(tǒng)中的/dev,/proc,/bin,/etc等標(biāo)準(zhǔn)目錄和文件
- 不同的Linux發(fā)行版,bootfs基本一樣,而rootfs不同。如Ubuntu,centos等。
原理解密:
Docker鏡像是由特殊的文件系統(tǒng)疊加而成的。最低端是bootfs,并使用宿主機(jī)的bootfs。第二層是root文件系統(tǒng),被稱為base image;然后再往上可以疊加其他的鏡像文件。統(tǒng)一文件系統(tǒng)技術(shù)能夠?qū)⒉煌膶盈B加成一個(gè)文件系統(tǒng),為這些層提供一個(gè)統(tǒng)一的視角,這樣就隱藏了多層的存在。在用戶的角度看來(lái),只存在一個(gè)文件系統(tǒng)。一個(gè)鏡像可以放在另一個(gè)鏡像的上面,位于下面的鏡像稱為父鏡像,最底部的鏡像稱為基礎(chǔ)鏡像。
當(dāng)從一個(gè)鏡像啟動(dòng)容器時(shí),docker會(huì)在最頂層加載一個(gè)讀寫文件系統(tǒng)作為容器;(即生成一個(gè)新的鏡像實(shí)例,這樣就可以進(jìn)行修改相關(guān)文件 否則是不能修改只讀文件的)
鏡像制作
docker鏡像如何制作?
1 容器轉(zhuǎn)為鏡像;(上述中生成的鏡像 變成自己的鏡像)
在新的鏡像中只包換了不是通過目錄加載的文件;)
#轉(zhuǎn)化 注意通過掛載的方法不能使進(jìn)行同步轉(zhuǎn)化過去
docker commit 容器id 鏡像名稱:版本號(hào)
比如把項(xiàng)目放到nginx服務(wù)上,重新轉(zhuǎn)化為鏡像 進(jìn)行壓縮,給到測(cè)試人員進(jìn)行測(cè)試
#壓縮
docker save -o 壓縮文件名稱 鏡像名稱:版本號(hào)
給到測(cè)試人員,測(cè)試人員進(jìn)行解壓;
#解壓
docker load -i 壓縮文件名稱
因?yàn)檫@樣掛載文件會(huì)有問題,所有指令示的操作了解即可。主要通過dockerfile
Dockerfile概念及作用
本質(zhì)就是一個(gè)文本文件,包含了很多條指令,每一條指令構(gòu)建一層,基于基礎(chǔ)鏡像,最終構(gòu)建一個(gè)新的鏡像。
好處:對(duì)于開發(fā)人員,可以為開發(fā)團(tuán)隊(duì)提供一個(gè)完全一致的開發(fā)環(huán)境。對(duì)于測(cè)試人員,可以直接拿開發(fā)時(shí)所構(gòu)建的鏡像或者通過Dockerfile文件構(gòu)建一個(gè)新的鏡像開始工作了。對(duì)于運(yùn)維人員,在部署時(shí),可以實(shí)現(xiàn)應(yīng)用的無(wú)縫移植。
Dockerfile關(guān)鍵字
關(guān)鍵字 | 作用 | 備注 |
---|---|---|
FROM | 制定父鏡像 | 指定Dockerfile基于那個(gè)image構(gòu)建 |
RUN | 執(zhí)行命令 | 執(zhí)行一段命令,默認(rèn)是/bin/sh格式:RUN command |
CMD | 容器啟動(dòng)命令 | 提供啟動(dòng)容器時(shí)候的默認(rèn)命令 |
ENTRYPOINT | 入口 | 一般在制作一些執(zhí)行就關(guān)閉的容器中會(huì)使用 配合CMD |
COPY | 復(fù)制文件 | build的時(shí)候復(fù)制文件到image中 |
ADD | 添加文件 | build的時(shí)候添加文件到image中,不僅僅局限于上下文,可以來(lái)源于遠(yuǎn)程服務(wù) |
ENV | 環(huán)境變量 | 制定build時(shí)候的環(huán)境變量 可以在啟動(dòng)的容器的時(shí)候 通過-e 覆蓋 格式:name=value |
ARG | 構(gòu)建參數(shù) | 構(gòu)建參數(shù) 只在構(gòu)建的時(shí)候使用的參數(shù) 如果有ENV 那么env 相同的名字會(huì)覆蓋arg的參數(shù) |
VOLUME | 定義外部可以掛載的數(shù)據(jù)卷 |
關(guān)鍵字 | 作用 | 備注 |
---|---|---|
EXPORSE | 暴露端口 | 定義容器運(yùn)行的時(shí)候監(jiān)聽的端口 啟動(dòng)容器的使用-p來(lái)綁定暴露端口,格式 EXPORSE 8080或者 EXPORSE 8080/udp |
WORKDIR | 工作目錄 | 制定容器內(nèi)部的工作沒目錄 如果沒有創(chuàng)建的話則自動(dòng)創(chuàng)建 如果指定/使用的是絕對(duì)地址 |
USER | 指定執(zhí)行用戶 | 指定build或者啟動(dòng)的時(shí)候 用戶在RUN CMD ENTRYPOINT執(zhí)行的時(shí)候的用戶 |
HEALTHCHECK | 健康檢查 | 指定監(jiān)測(cè)當(dāng)前容器的健康監(jiān)測(cè)的命令 基本上沒用 |
OUTBUILD | 觸發(fā)器 | 存在OUTBUILD關(guān)鍵字的鏡像作為基礎(chǔ)鏡像的時(shí)候,當(dāng)執(zhí)行FROM完成后會(huì)執(zhí)行OUTBUILD的命令,用處不大 |
STOPSIGNAL | 發(fā)送信號(hào)量到宿主機(jī) | 該指令設(shè)置將發(fā)送到容器的系統(tǒng)調(diào)用信號(hào)以退出; |
SHELL | 指定執(zhí)行腳本的shell | 指定RUN CMD ENTRYPOINT執(zhí)行命令的時(shí)候,使用的shell |
案例
上述的指令 只需要掌握經(jīng)常使用的關(guān)鍵字即可;
docker build -f(指定Dockerfile文件地址) ./centos_dockerfile -t(設(shè)置新的鏡像的名稱和版本) ht_centos:1 .(.代表一個(gè)路徑)