一个前端工程师的docker之路
1. 布署軟件的問題 #
- 如果想讓軟件運行起來要保證操作系統的設置,各種庫和組件的安裝都是正確的
- 熱帶魚&冷水魚 冷水魚適應的水溫在5-30度,而熱帶魚只能適應22-30度水溫,低于22度半小時就凍死了
2. 虛擬機 #
- 虛擬機(virtual machine)就是帶環境安裝的一種解決方案。它可以在一種操作系統里面運行另一種操作系統
- 資源占用多
- 冗余步驟多
- 啟動速度慢
 
3. Linux 容器 #
- 由于虛擬機存在這些缺點,Linux 發展出了另一種虛擬化技術:Linux 容器(Linux Containers,縮寫為 LXC)。
- Linux 容器不是模擬一個完整的操作系統,而是對進程進行隔離。或者說,在正常進程的外面套了一個保護層。對于容器里面的進程來說,它接觸到的各種資源都是虛擬的,從而實現與底層系統的隔離。
- 啟動快
- 資源占用少
- 體積小
 
4. Docker 是什么 #
- Docker 屬于 Linux 容器的一種封裝,提供簡單易用的容器使用接口。它是目前最流行的 Linux 容器解決方案。
- Docker 將應用程序與該程序的依賴,打包在一個文件里面。運行這個文件,就會生成一個虛擬容器。程序在這個虛擬容器里運行,就好像在真實的物理機上運行一樣
5. docker和KVM #
- 啟動時間
- Docker秒級啟動
- KVM分鐘級啟動
 
- 輕量級 容器鏡像通常以M為單位,虛擬機以G為單位,容器資源占用小,要比虛擬要部署更快速
- 容器共享宿主機內核,系統級虛擬化,占用資源少,容器性能基本接近物理機
- 虛擬機需要虛擬化一些設備,具有完整的OS,虛擬機開銷大,因而降低性能,沒有容器性能好
 
- 安全性
- 由于共享宿主機內核,只是進程隔離,因此隔離性和穩定性不如虛擬機,容器具有一定權限訪問宿主機內核,存在一下安全隱患
 
- 使用要求
- KVM基于硬件的完全虛擬化,需要硬件CPU虛擬化技術支持
- 容器共享宿主機內核,可運行在主機的Linux的發行版,不用考慮CPU是否支持虛擬化技術
 
6. docker應用場景 #
- 節省項目環境部署時間
- 單項目打包
- 整套項目打包
- 新開源技術
 
- 環境一致性
- 持續集成
- 微服務
- 彈性伸縮
7. Docker 體系結構 #
- containerd 是一個守護進程,使用runc管理容器,向Docker Engine提供接口
- shim 只負責管理一個容器
- runC是一個輕量級工具,只用來運行容器
8. Docker內部組件 #
- namespaces命名空間,Linux內核提供的一種對進程資源隔離的機制,例如進程、網絡、掛載等資源
- cgroups控制組,linux內核提供的一種限制進程資源的機制,例如cpu 內存等資源
- unonFS聯合文件系統,支持將不同位置的目錄掛載到同一虛擬文件系統,形成一種分層的模型
9. docker安裝 #
- docker分為企業版(EE)和社區版(CE)
- docker-ce
- hub.docker
9.1 安裝 #
yum install -y yum-utils   device-mapper-persistent-data   lvm2
yum-config-manager     --add-repo     https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --enable docker-ce-nightly #要每日構建版本的 Docker CE
yum-config-manager --enable docker-ce-test  
yum install docker-ce docker-ce-cli containerd.io
復制代碼9.2 啟動 #
systemctl start docker
復制代碼9.3 查看docker版本 #
$ docker version
$ docker info
復制代碼9.4 卸載 #
docker info
yum remove docker
rm -rf /var/lib/docker
復制代碼10. Docker架構 #
11.阿里云加速 #
- 鏡像倉庫
- 鏡像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://fwvjnv59.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
復制代碼12. image鏡像 #
- Docker 把應用程序及其依賴,打包在 image 文件里面。只有通過這個文件,才能生成 Docker 容器
- image 文件可以看作是容器的模板
- Docker 根據 image 文件生成容器的實例
- 同一個 image 文件,可以生成多個同時運行的容器實例
- 鏡像不是一個單一的文件,而是有多層
- 容器其實就是在鏡像的最上面加了一層讀寫層,在運行容器里做的任何文件改動,都會寫到這個讀寫層里。如果容器刪除了,最上面的讀寫層也就刪除了,改動也就丟失了
- 我們可以通過docker history <ID/NAME>查看鏡像中各層內容及大小,每層對應著Dockerfile中的一條指令
| 命令 | 含義 | 案例 | 
|---|---|---|
| ls | 查看全部鏡像 | docker image ls | 
| search | 查找鏡像 | docker search [imageName] | 
| history | 查看鏡像歷史 | docker history [imageName] | 
| inspect | 顯示一個或多個鏡像詳細信息 | docker inspect [imageName] | 
| pull | 拉取鏡像 | docker pull [imageName] | 
| push | 推送一個鏡像到鏡像倉庫 | docker push [imageName] | 
| rmi | 刪除鏡像 | docker rmi [imageName] docker image rmi 2 | 
| prune | 移除未使用的鏡像,沒有被標記或補任何容器引用 | docker image prune | 
| tag | 標記本地鏡像,將其歸入某一倉庫 | docker image tag [imageName] [username]/[repository]:[tag] | 
| export | 導出容器文件系統tar歸檔文件創建鏡像 | docker export -o mysqlv1.tar a404c6c174a2 | 
| import | 導入容器快照文件系統tar歸檔文件創建鏡像 | docker import mysqlv1.tar zf/mysql:v2 | 
| save | 保存一個或多個鏡像到一個tar歸檔文件 | docker save -o mysqlv2.tar zf/mysqlv2:v3 | 
| load | 加載鏡像存儲文件來自tar歸檔或標準輸入 | docker load -i mysqlv2.tar | 
| build | 根據Dockerfile構建鏡像 | 
用戶既可以使用
docker load來導入鏡像存儲文件到本地鏡像庫,也可以使用docker import來導入一個容器快照到本地鏡像庫。這兩者的區別在于容器快照文件將丟棄所有的歷史記錄和元數據信息(即僅保存容器當時的快照狀態),而鏡像存儲文件將保存完整記錄,體積也要大。此外,從容器快照文件導入時可以重新指定標簽等元數據信息。
12.1 查看鏡像 #
docker image ls
復制代碼| 字段 | 含義 | 
|---|---|
| REPOSITORY | 倉庫地址 | 
| TAG | 標簽 | 
| IMAGE_ID | 鏡像ID | 
| CREATED | 創建時間 | 
| SIZE | 鏡像大小 | 
12.2 查找鏡像 #
docker search ubuntu
復制代碼| 字段 | 含義 | 
|---|---|
| NAME | 名稱 | 
| DESCRIPTION | 描述 | 
| STARTS | 星星的數量 | 
| OFFICIAL | 是否官方源 | 
12.3 拉取鏡像 #
docker  pull docker.io/hello-world
復制代碼- docker image pull是抓取 image 文件的命令
- docker.io/hello-world是 image 文件在倉庫里面的位置,其中docker.io是 image的作者,hello-world是 image 文件的名字
- Docker 官方提供的 image 文件,都放在docker.io組里面,所以它的是默認組,可以省略docker image pull hello-world
12.4 刪除鏡像 #
docker rmi  hello-world
復制代碼13. 容器 #
- docker run命令會從- image文件,生成一個正在運行的容器實例。
- docker container run命令具有自動抓取 image 文件的功能。如果發現本地沒有指定的 image 文件,就會從倉庫自動抓取
- 輸出提示以后,hello world就會停止運行,容器自動終止。
- 有些容器不會自動終止
- image 文件生成的容器實例,本身也是一個文件,稱為容器文件
- 容器生成,就會同時存在兩個文件: image 文件和容器文件
- 關閉容器并不會刪除容器文件,只是容器停止運行
13.1 命令 #
| 命令 | 含義 | 案例 | 
|---|---|---|
| run | 從鏡像運行一個容器 | docker run ubuntu /bin/echo 'hello-world' | 
| ls | 列出容器 | docker container ls | 
| inspect | 顯示一個或多個容器詳細信息 | docker inspect | 
| attach | 要attach上去的容器必須正在運行,可以同時連接上同一個container來共享屏幕 | docker attach | 
| stats | 顯示容器資源使用統計 | docker container stats | 
| top | 顯示一個容器運行的進程 | docker container top | 
| update | 顯示一個容器運行的進程 | docker container update | 
| port | 更新一個或多個容器配置 | docker container port | 
| ps | 查看當前運行的容器 | docker ps -a -l | 
| kill [containerId] | 終止容器(發送SIGKILL ) | docker kill [containerId] | 
| rm [containerId] | 刪除容器 | docker rm [containerId] | 
| start [containerId] | 啟動已經生成、已經停止運行的容器文件 | docker start [containerId] | 
| stop [containerId] | 終止容器運行 (發送 SIGTERM ) | docker stop [containerId] | 
| logs [containerId] | 查看 docker 容器的輸出 | docker logs [containerId] | 
| exec [containerId] | 進入一個正在運行的 docker 容器執行命令 | docker container exec -it [containerID] /bin/bash | 
| cp [containerId] | 從正在運行的 Docker 容器里面,將文件拷貝到本機 | docker container cp [containID]:app/package.json . | 
| commit [containerId] | 創建一個新鏡像來自一個容器 | docker commit -a "zhufeng" -m "mysql" a404c6c174a2 mynginx:v1 | 
13.2 啟動容器 #
docker run ubuntu /bin/echo "Hello world"
復制代碼- docker: Docker 的二進制執行文件。
- run:與前面的 docker 組合來運行一個容器。
- ubuntu指定要運行的鏡像,Docker首先從本地主機上查找鏡像是否存在,如果不存在,Docker 就會從鏡像倉庫 Docker Hub 下載公共鏡像。
- /bin/echo "Hello world": 在啟動的容器里執行的命令
Docker以ubuntu鏡像創建一個新容器,然后在容器里執行 bin/echo "Hello world",然后輸出結果
| 參數 | 含義 | 
|---|---|
| -i --interactive | 交互式 | 
| -t --tty | 分配一個偽終端 | 
| -d --detach | 運行容器到后臺 | 
| -a --attach list | 附加到運行的容器 | 
| -e --env list | 設置環境變量 | 
| -p --publish list | 發布容器端口到主機 | 
| -P | --publish-all | 
| --mount mount | 掛載宿主機分區到容器 | 
| -v,--volumn list | 掛載宿主機分區到容器 | 
13.3 查看容器 #
docker ps
docker -a
docker -l
復制代碼- -a 顯示所有的容器,包括已停止的
- -l 顯示最新的那個容器
| 字段 | 含義 | 
|---|---|
| CONTAINER ID | 容器ID | 
| IMAGE | 使用的鏡像 | 
| COMMAND | 使用的命令 | 
| CREATED | 創建時間 | 
| STATUS | 狀態 | 
| PORTS | 端口號 | 
| NAMES | 自動分配的名稱 | 
13.4 運行交互式的容器 #
docker run -i -t ubuntu /bin/bash
復制代碼- -t=--interactive 在新容器內指定一個偽終端或終端。
- -i=--tty 允許你對容器內的標準輸入 (STDIN) 進行交互。
我們可以通過運行exit命令或者使用CTRL+D來退出容器。
13.5 后臺運行容器 #
docker run --detach centos ping www.baidu.com
docker ps 
docker logs --follow ad04d9acde94
docker stop ad04d9acde94
復制代碼13.6 kill #
docker kill 5a5c3a760f61
復制代碼kill是不管容器同不同意,直接執行
kill -9,強行終止;stop的話,首先給容器發送一個TERM信號,讓容器做一些退出前必須的保護性、安全性操作,然后讓容器自動停止運行,如果在一段時間內,容器還是沒有停止,再進行kill -9,強行終止
13.7 刪除容器 #
- docker rm 刪除容器
- docker rmi 刪除鏡像
- docker rm $(docker ps -a -q)
docker rm 5a5c3a760f61
復制代碼13.8 啟動容器 #
docker start [containerId]
復制代碼13.9 停止容器 #
docker stop [containerId]
復制代碼13.10 進入一個容器 #
docker attach [containerID]
復制代碼13.11 進入一個正在運行中的容器 #
docker container -exec -it [containerID] /bin/bash
復制代碼13.12 拷貝文件 #
docker container cp [containerID] /readme.md .
復制代碼13.13 自動刪除 #
docker run --rm ubuntu /bin/bash
復制代碼14. 制作個性化鏡像 #
docker commit -m"hello" -a "zhangrenyang" [containerId] zhangrenyang/hello:latest
docker images
docker run zhangrenyang/hello /bin/bash
docker rm b2839066c362
docker rmi c79ef5b3f5fc
復制代碼15. 制作Dockerfile #
- Docker 的鏡像是用一層一層的文件組成的
- docker inspect命令可以查看鏡像或者容器
- Layers就是鏡像的層文件,只讀不能修改。基于鏡像創建的容器會共享這些文件層
docker inspect centos
復制代碼15.1 編寫Dockerfile #
| 命令 | 含義 | 案例 | 
|---|---|---|
| FROM | 繼承的鏡像 | FROM node | 
| COPY | 拷貝 | COPY ./app /app | 
| WORKDIR | 指定工作路徑 | WORKDIR /app | 
| RUN | 編譯打包階段運行命令 | RUN npm install | 
| EXPOSE | 暴露端口 | EXPOSE 3000 | 
| CMD | 容器運行階段運行命令 | CMD npm run start | 
15.2 .dockerignore #
表示要排除,不要打包到image中的文件路徑
.git
node_modules
復制代碼15.3 Dockerfile #
15.3.1 安裝node #
- nvm
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash nvm install stable node -v npm i cnpm -g npm i nrm -g 復制代碼
15.3.2 安裝express項目生成器 #
npm install express-generator -g
express app
復制代碼15.3.3 Dockerfile #
FROM node
COPY ./app /app
WORKDIR /app
RUN npm install
EXPOSE 3000
復制代碼- FROM 表示該鏡像繼承的鏡像 :表示標簽
- COPY 是將當前目錄下的app目錄下面的文件都拷貝到image里的/app目錄中
- WORKDIR 指定工作路徑,類似于執行 cd命令
- RUN npm install 在/app目錄下安裝依賴,安裝后的依賴也會打包到image目錄中
- EXPOSE 暴露3000端口,允許外部連接這個端口
15.4 創建image #
docker build -t express-demo .
復制代碼- -t用來指定image鏡像的名稱,后面還可以加冒號指定標簽,如果不指定默認就是latest
- .表示Dockerfile文件的所有路徑,- .就表示當前路徑
15.5 使用新的鏡像運行容器 #
docker container run -p 3333:3000 -it express-demo /bin/bash
復制代碼npm start
復制代碼- -p參數是將容器的3000端口映射為本機的3333端口
- -it參數是將容器的shell容器映射為當前的shell,在本機容器中執行的命令都會發送到容器當中執行
- express-demoimage的名稱
- /bin/bash 容器啟動后執行的第一個命令,這里是啟動了bash容器以便執行腳本
- --rm在容器終止運行后自動刪除容器文件
15.6 CMD #
CMD npm start
復制代碼- RUN命令在 image 文件的構建階段執行,執行結果都會打包進入 image 文件;CMD命令則是在容器啟動后執行
- 一個 Dockerfile 可以包含多個RUN命令,但是只能有一個CMD命令
- 指定了CMD命令以后,docker container run命令就不能附加命令了(比如前面的/bin/bash),否則它會覆蓋CMD命令
15.7 發布image #
- 注冊賬戶
- docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
docker login
docker image tag [imageName] [username]/[repository]:[tag]
docker image build -t [username]/[repository]:[tag] .
復制代碼docker tag express-demo zhangrenyang/express-demo:1.0.0 docker push zhangrenyang/express-demo:1.0.0 復制代碼
16. 數據盤 #
- 刪除容器的時候,容器層里創建的文件也會被刪除掉,如果有些數據你想永久保存,比如Web服務器的日志,數據庫管理系統中的數據,可以為容器創建一個數據盤
16.1 volume #
- volumes Docker管理宿主機文件系統的一部分(/var/lib/docker/volumes)
- 如果沒有指定卷,則會自動創建
- 建議使用--mount ,更通用
16.1.1 創建數據卷 #
docker volume --help
docker volume create nginx-vol
docker volume ls
docker volume inspect nginx-vol
復制代碼#把nginx-vol數據卷掛載到/usr/share/nginx/html
docker run -d -it --name=nginx1 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
docker run -d -it --name=nginx2 -v nginx-vol:/usr/share/nginx/html nginx
復制代碼16.1.2 刪除數據卷 #
docker container stop nginx1 停止容器
docker container rm nginx1 刪除容器
docker volume rm nginx-vol  刪除數據庫
復制代碼16.1.3 管理數據盤 #
docker volume ls #列出所有的數據盤
docker volume ls -f dangling=true #列出已經孤立的數據盤
docker volume rm xxxx #刪除數據盤
docker volume ls      #列出數據盤
復制代碼16.2 Bind mounts #
- 此方式與Linux系統的mount方式很相似,即是會覆蓋容器內已存在的目錄或文件,但并不會改變容器內原有的文件,當umount后容器內原有的文件就會還原
- 創建容器的時候我們可以通過-v或--volumn給它指定一下數據盤
- bind mounts可以存儲在宿主機系統的任意位置
- 如果源文件/目錄不存在,不會自動創建,會拋出一個錯誤
- 如果掛載目標在容器中非空目錄,則該目錄現有內容將被隱藏
16.2.1 默認數據盤 #
- -v 參數兩種掛載數據方式都可以用
docker run -v /mnt:/mnt -it --name logs centos bash
cd /mnt
echo 1 > 1.txt
exit
復制代碼docker inspect logs
"Mounts": [{"Source":"/mnt/sda1/var/lib/docker/volumes/dea6a8b3aefafa907d883895bbf931a502a51959f83d63b7ece8d7814cf5d489/_data","Destination": "/mnt",}
]
復制代碼- Source的值就是我們給容器指定的數據盤在主機上的位置
- Destination的值是這個數據盤在容器上的位置
16.2.2 指定數據盤 #
mkdir ~/data
docker run -v ~/data:/mnt -ti --name logs2 centos bash
cd /mnt
echo 3 > 3.txt
exit
cat ~/data/3.txt
復制代碼- ~/data:/mnt 把當前用戶目錄中的data目錄映射到/mnt上
16.2.3 指定數據盤容器 #
docker create -v /mnt --name logger centos
docker run --volumes-from logger --name logger3 -i -t centos bash
cd /mnt 
touch logger3
docker run --volumes-from logger --name logger4 -i -t centos bash
cd /mnt
touch logger4
復制代碼17. 網絡 #
docker里面有一個DNS服務,可以通過容器名稱訪問主機 網絡類型
- none 無網絡,對外界完全隔離
- host 主機網絡
- bridge 橋接網絡,默認網絡
17.1 bridge #
docker network ls
docker inspect bridge
docker run -d --name server1 nginx
docker run -d --name server2 nginx
docker exec -it server1 bash
ping server2
復制代碼17.2 none #
docker run -d --name server_none --net none nginx
docker inspect none
docker exec -it server_none bash
ip addr
復制代碼17.3 host #
docker run -d --name server_host --net host nginx
docker inspect none
docker exec -it server_host bash
ip addr
復制代碼17.4 訪問橋接網絡里面的服務 #
docker inspect nginx
443 80
docker run -d --name server_nginx -p "8080:80"  nginx
復制代碼- 訪問主機的8080端口會被定向到容器的80端口
17.5 查看主機綁定的端口 #
docker inspect [容器名稱]
docker port server_nginx
復制代碼17.6 指向主機的隨機端口 #
docker run -d --name webserver --publish 80 nginx
docker port webserver
復制代碼docker run -d --name webserver --publish-all nginx docker run -d --name webserver --P nginx ` 復制代碼
17.7 創建自定義網絡 #
docker network create --driver bridge web
docker network inspect web
復制代碼17.8 制定網絡 #
docker run -d --name webserver  --net web nginx
docker network connect  web webserver1
docker network disconnect web webserver2
復制代碼18.compose #
- Compose 通過一個配置文件來管理多個Docker容器,在配置文件中,所有的容器通過services來定義,然后使用docker-compose腳本來啟動,停止和重啟應用,和應用中的服務以及所有依賴服務的容器,非常適合組合使用多個容器進行開發的場景 步驟:
- 在 docker-compose.yml中定義組成應用程序的服務,以便它們可以在隔離的環境中一起運行。
- 最后,運行docker-compose up,Compose 將啟動并運行整個應用程序。 配置文件組成
- services 可以定義需要的服務,每個服務都有自己的名字、使用的鏡像、掛載的數據卷所屬的網絡和依賴的其它服務。
- networks 是應用的網絡,在它下面可以定義使用的網絡名稱,類性。
- volumes是數據卷,可以在此定義數據卷,然后掛載到不同的服務上面使用。
pip install docker-compose 復制代碼
18.1 docker-compose.yml #
- 空格縮進表示層次
- 冒號空格后面有空格
version: '2'
services:
  zfpx1:
    image: nginx
    port:
      - "8080:80"
  zfpx2:
    image: nginx
    port:
      - "8081:80"
復制代碼18.2 nginx工具包 #
apt update
#ping
apt install inetutils-ping 
#nslookup
apt install dnsutils   
#ifconfig 
apt install net-tools    
#ip
apt install iproute2     
#curl
apt install curl
復制代碼18.3 啟動 #
docker-compose up 啟動所有的服務
docker-compose -d 后臺啟動所有的服務
docker-compose ps 打印所有的容器
docker-compose stop 停止所有服務
docker-compose logs -f 持續跟蹤日志
docker-compose exec zfpx1 bash 進入zfpx服務系統
docker-compose rm 刪除服務容器
docker network ls 網絡不會刪除
docker-compose down 刪除網路
復制代碼- docker會創建默認的網絡
18.4 配置網絡 #
docker-compose up -d
docker-compose exec zfpx1 bash
ping zfpx2 可以通過服務的名字連接到對方
復制代碼18.5 配置數據卷 #
version: '2'
services:zfpx1:image: nginxports:- "8080:80"networks:- "zfpx"volumes:- "access:/mnt"zfpx2:image: nginxports:- "8081:80"networks:- "zfpx"volumes:- "access:/mnt"zfpx3:image: nginxports:- "8082:80"networks:- "default"- "zfpx"
networks:zfpx:driver: bridge
volumes:access:driver: local
復制代碼18.6 配置根目錄 #
version: '2'
services:zfpx1:image: nginxports:- "8080:80"networks:- "zfpx"volumes:- "access:/mnt"- "./zfpx1:/usr/share/nginx/html"zfpx2:image: nginxports:- "8081:80"networks:- "zfpx"volumes:- "access:/mnt"- "./zfpx2:/usr/share/nginx/html"zfpx3:image: nginxports:- "8082:80"networks:- "default"- "zfpx"
networks:zfpx:driver: bridge
volumes:access:driver: local
復制代碼19. nodeapp #
nodeapp 是一個用 Docker 搭建的本地 Node.js 應用開發與運行環境。
19.1 服務 #
- db:使用 mariadb作為應用的數據庫
- node:啟動node服務
- web:使用 nginx作為應用的 web 服務器
19.2 結構 #
- app:這個目錄存儲應用
- web 放應用的代碼
 
- services: 環境里定義的服務需要的一些服務
- images: 方式一些貶義的腳本和鏡像
- docker-compose.yml:定義本地開發環境需要的服務
- images/nginx/config/default.conf 放置nginx 配置文件
- node 的Dockfile配置文件
19.3 docker-compose.yml #
version: '2'
services:
 node:
  build:
    context: ./images/node
    dockerfile: Dockerfile
  volumes:
    - ./app/web:/web
  depends_on:
   - db
 web:
  image: nginx
  ports:
   - "8080:80"
  volumes:
   - ./images/nginx/config:/etc/nginx/conf.d
   - ./app/web/views:/mnt/views  
  depends_on:
   - node
 db:
  image: mariadb
  environment:
   MYSQL_ROOT_PASSWORD: "root"
   MYSQL_DATABASE: "node"
   MYSQL_USER: "zfpx"
   MYSQL_PASSWORD: "123456"
  volumes:
    - db:/var/lib/mysql
volumes:
 db:
  driver: local
復制代碼19.4 其它文件 #
19.4.1 app/web/server.js #
let http=require('http');
var mysql  = require('mysql');
var connection = mysql.createConnection({host     : 'db',user     : 'zfpx',password : '123456',database : 'node'
});
connection.connect();
 復制代碼
let server=http.createServer(function (req,res) { connection.query('SELECT 2 + 2 AS solution', function (error, results, fields) { if (error) throw error; res.end(''+results[0].solution); }); }); server.listen(3000); 復制代碼
19.4.2 package.json #
"scripts": {"start": "node server.js"},
"dependencies": {"mysql": "^2.16.0"
}
復制代碼19.4.3 images/node/Dockerfile #
FROM node
MAINTAINER zhangrenyang <zhang_renyang@126.com>
WORKDIR /web
RUN npm install
CMD npm start
復制代碼19.4.4 images/nginx/config/default.conf #
upstream backend {server node:3000;
}
server {listen 80;server_name localhost;root /mnt/views;index index.html index.htm;
location /api {proxy_pass http:<span class="hljs-comment">//backend;</span>
}
復制代碼 復制代碼
} 復制代碼
20. 搭建LNMP網站 #
20.1 關閉防火墻 #
| 功能 | 命令 | 
|---|---|
| 停止防火墻 | systemctl stop firewalld.service | 
| 永久關閉防火墻 | systemctl disable firewalld.service | 
20.2 創建自定義網絡 #
docker network create lnmp
復制代碼20.3 創建mysql數據庫容器 #
 docker run -itd --name lnmp_mysql --net lnmp -p 3306:3306 --mount src=mysql-vol,dst=/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.6 --character-set-server=utf8yum install -y mysql
復制代碼20.4 創建所需數據庫 #
docker exec lnmp_mysql bash -c 'exec mysql -uroot  -p"$MYSQL_ROOT_PASSWORD" -e"create database wordpress"'
復制代碼20.5 創建PHP容器 #
mkdir -p /app/wwwroot
docker run -itd --name lnmp_web --net lnmp -p 8888:80 --mount type=bind,src=/app/wwwroot,dst=/var/www/html richarvey/nginx-php-fpm
復制代碼20.6 wordpress #
cd /opt/src
wget https://wordpress.org/latest.tar.gz
tar -xzvf latest.tar.gz -C /app/wwwroot
http://IP:88/wordpress
http://192.168.20.129:8888/wordpress/wp-admin/setup-config.php
復制代碼21. Dockerfile #
21.1 語法 #
| 指令 | 含義 | 示例 | ||
|---|---|---|---|---|
| FROM | 構建的新鏡像是基于哪個鏡像 | FROM centos:6 | ||
| MAINTAINER | 鏡像維護者姓名或郵箱地址 | MAINTAINER zhufengjiagou | ||
| RUN | 構建鏡像時運行的shell命令 | RUN yum install httpd | ||
| CMD | CMD 設置容器啟動后默認執行的命令及其參數,但 CMD 能夠被 docker run 后面跟的命令行參數替換 | CMD /usr/sbin/sshd -D | ||
| EXPOSE | 聲明容器運行的服務器端口 | EXPOSE 80 443 | ||
| ENV | 設置容器內的環境變量 | ENV MYSQL_ROOT_PASSWORD 123456 | ||
| ADD | 拷貝文件或目錄到鏡像中,如果是URL或者壓縮包會自動下載和解壓 | ADD ,ADD xxx.com/html.tar.gz /var/www.html, ADD html.tar.gz /var/www/html | ||
| COPY | 拷貝文件或目錄到鏡像 | COPY ./start.sh /start.sh | ||
| ENTRYPOINT | 配置容器啟動時運行的命令 | ENTRYPOINT /bin/bash -c '/start.sh' | ||
| VOLUME | 指定容器掛載點到宿主自動生成的目錄或其它容器 | VOLUME ["/var/lib/mysql"] | ||
| USER | 為 RUN CMD和ENTRYPOINT執行命令指定運行用戶 | USER zhufengjiagou | ||
| WORKDIR | 為RUN CMD ENTRYPOINT COPY ADD 設置工作目錄 | WORKDIR /data | ||
| HEALTHCHECK | 健康檢查 | HEALTHCHECK --interval=5m --timeout=3s --retries=3 CMS curl -f htp://localhost | exit 1 | |
| ARG | 在構建鏡像時指定一些參數 | ARG user | 
21.2 build鏡像命令 #
- -t --tag list 鏡像名稱
- -f --file string 指定Dockerfile文件的位置
21.3 搭建nginx鏡像 #
mkdir /usr/local/src
cd /usr/local/src
wget http://nginx.org/download/nginx-1.12.1.tar.gz
#如果容器內無法聯網可以重啟docker
systemctl restart docker 
復制代碼FROM centos
MAINTAINER zhufengjiagou
RUN yum install -y gcc gcc-c++ make openssl-devel pcre-devel
ADD nginx-1.12.1.tar.gz /tmp
RUN cd /tmp/nginx-1.12.1 && \./configure --prefix=/usr/local/nginx && \make -j 2 && \make install
RUN rm -rf /tmp/nginx-1.12.1 && yum clean all
COPY nginx.conf /usr/local/nginx/conf
WORKDIR /usr/local/nginx
EXPOSE 80
CMD ["./sbin/nginx","-g","daemon off;"] 
復制代碼docker image build -t nginx:v1 -f Dockerfile .
復制代碼21.4 搭建php鏡像 #
wget http://nchc.dl.sourceforge.net/project/mcrypt/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.gz
wget http://cn.php.net/distributions/php-5.6.30.tar.gz
復制代碼FROM centos
MAINTAINER zhufengjiagou
RUN yum -y install gcc gcc-c++ make automake autoconf libtool openssl-devel pcre-devel libxml2 libxml2-devel bzip2 bzip2-devel libjpeg-turbo libjpeg-turbo-devel libpng libpng-devel freetype freetype-devel zlib zlib-devel libcurl libcurl-devel
ADD libmcrypt-2.5.8.tar.gz /tmp
RUN cd /tmp/libmcrypt-2.5.8 && \./configure && \make -j 2 && \make install
ADD php-5.6.30.tar.gz /tmp
RUN cd /tmp/php-5.6.30 && \./configure --prefix=/usr/local/php --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-mysql=mysqlnd --with-openssl --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-mcrypt --with-zlib --with-libxml-dir=/usr --enable-xml  --enable-sockets --enable-fpm --with-config-file-path=/usr/local/php/etc --with-bz2 --with-gd && \make -j 2 && \make install
RUN cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
RUN sed -i 's/127.0.0.1/0.0.0.0/g' /usr/local/php/etc/php-fpm.conf
RUN sed -i  '89a daemonize = no' /usr/local/php/etc/php-fpm.conf
RUN rm -rf /tmp/php-5.6.30 && yum clean all 
WORKDIR /usr/local/php 
EXPOSE 9000
CMD ["/usr/local/php/sbin/php-fpm","-c","/usr/local/php/etc/php-fpm.conf"]
復制代碼docker image build -t php:v1 -f Dockerfile .
復制代碼22. 布署PHP網站 #
22.1 自定義網絡 #
docker network create lnmp
復制代碼22.2 創建PHP容器 #
docker run -itd \
--name lnmp_php
--net lnmp \
--mount type=bind,src=/app/wwwroot,dst=/usr/local/nginx/html \
php:v1
復制代碼22.3 創建nginx容器 #
docker run -itd \
--name lnmp_nginx
--net lnmp \
-p 8888:80 \
--mount type=bind,src=/app/wwwroot,dst=/usr/local/nginx/html \
nginx:v1
復制代碼22.4 創建mysql容器 #
docker run -itd \
--name lnmp_mysql
--net lnmp \
--mount type=bind,src=mysql-vol,dst=/usr/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456
mysql --character-set-server=utf8
復制代碼23. 布署Java網站 #
wget  https://download.oracle.com/otn/java/jdk/7u80-b15/jdk-7u80-linux-x64.tar.gz?AuthParam=1555491494_9f57610fb0c84418f58ad1b9bc5a3be6
復制代碼wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-7/v7.0.94/bin/apache-tomcat-7.0.94.tar.gz 復制代碼
tomcat
FROM centos
MAINTAINER zhufengjiagou
ADD  jdk-7u80-linux-x64.tar.gz /usr/local
ENV JAVA_HOME /usr/local/jdk1.7.0_80
ADD apache-tomcat-7.0.94.tar.gz /usr/local
COPY server.xml /user/local/apache/conf
RUN rm -f /usr/local/*.tar.gz
WORKDIR /usr/local/apache-tomcat-7.0.94
EXPOSE 8080
ENTRYPOINT ["./bin/catalina.sh","run"]
復制代碼docker image build -t tomcat:v1 -f Dockerfile .
復制代碼docker run -itd \
--name=tomcat
-p 8080:8080
--mount type=bind,src=/app/webapps,dst=/usr/local/apache-tomcat-7.0.94/webapps \
tomcat:v1
復制代碼23. 發布 #
注冊賬號 hub.docker.com
登錄Docker Hub docker login
docker login --username=zhangrenyang --password=123456
鏡像打標簽 docker tag wordpress:v1 zhangrenyang/wordpress:v1
上傳 docker push zhangrenyang/wordpress:v1
搜索測試 docker search zhangrenyang
下載 docker pull zhangrenyang/wordpress:v1
20. 參考 #
- yaml
- mysql
轉載于:https://juejin.im/post/5d06ffcff265da1bcd37d78e
總結
以上是生活随笔為你收集整理的一个前端工程师的docker之路的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Failed to load the n
- 下一篇: windows 编译 caffe unr
