2020 Docker最新超詳細版教學通俗易懂
想安裝Docker,需要先將依賴的環境全部下載下來,就像Maven依賴JDK一樣
yum -y install yum-utils device-mapper-persistent-data lvm2
預設下載Docker會去國外伺服器下載,速度較慢,可以設定爲阿裡雲映象源,速度更快
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum -y install docker-ce
安裝成功後,需要手動啓動,設定爲開機啓動,並測試一下 Docker
#啓動docker服務
systemctl start docker
#設定開機自動啓動
systemctl enable docker
#測試
docker run hello-world
1.Docker官方的中央倉庫:這個倉庫是映象最全的,但是下載速度較慢。
https://hub.docker.com/
2.國內的映象網站:網易蜂巢,daoCloud等,下載速度快,但是映象相對不全。
https://c.163yun.com/hub#/home
http://hub.daocloud.io/ (推薦使用)
3.在公司內部會採用私服的方式拉取映象(新增設定)
#需要建立 /etc/docker/daemon.json,並新增如下內容
{
"registry-mirrors":["https://registry.docker-cn.com"],
"insecure-registries":["ip:port"]
}
#重新啓動兩個服務
systemctl daemon-reload
systemctl restart docker
從中央倉庫拉取映象到本地
docker pull 映象名稱[:tag]
#舉個栗子:docker pull daocloud.io/library/tomcat:8.5.15-jre8
檢視本地已經安裝過的映象資訊,包含標識,名稱,版本,更新時間,大小
docker images
映象會佔用磁碟空間,可以直接手動刪除,標識通過檢視獲取
docker rmi 映象的標識
如果因爲網路原因可以通過硬碟的方式傳輸映象,雖然不規範,但是有效,但是這種方式導出的映象名稱和版本都是null,需要手動修改
#將原生的映象導出
docker save -o 導出的路徑 映象id
#載入原生的映象檔案
docker load -i 映象檔案
#修改映象檔案
docker tag 映象id 新映象名稱:版本
執行容器需要定製具體映象,如果映象不存在,會直接下載
#簡單操作
docker run 映象的標識|映象的名稱[:tag]
#常用的參數
docker run -d -p 宿主機埠:容器埠 --name 容器名稱 映象的標識|映象名稱[:tag]
#-d:代表後臺執行容器
#-p 宿主機埠:容器埠:爲了對映當前Linux的埠和容器的埠
#--name 容器名稱:指定容器的名稱
檢視全部正在執行的容器資訊
docker ps [-qa]
#-a 檢視全部的容器,包括沒有執行
#-q 只檢視容器的標識
檢視容器日誌,以檢視容器執行的資訊
docker logs -f 容器id
#-f:可以卷動檢視日誌的最後幾行
可以進入容器的內部進行操作
docker exec -it 容器id bash
將宿主機的檔案複製到容器內部的指定目錄
docker cp 檔名稱 容器id:容器內部路徑
容器的啓動,停止,刪除等操作,後續會經常使用到
#重新啓動容器
docker restart 容器id
#啓動停止執行的容器
docker start 容器id
#停止指定的容器(刪除容器前,需要先停止容器)
docker stop 容器id
#停止全部容器
docker stop $(docker ps -qa)
#刪除指定容器
docker rm 容器id
#刪除全部容器
docker rm $(docker ps -qa)
執行Tomcat容器,爲部署ssm工程做準備
docker run -d -p 8080:8080 --name tomcat daocloud.io/library/tomcat:8.5.15-jre8
#或者已經下載了tomcat映象
docker run -d -p 8080:8080 --name tomcat 映象的標識
docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root daocloud.io/library/mysql:5.7.4
修改SSM工程環境,設定爲Linux中Docker容器的資訊
通過Maven的package重新打成war包
將Windows下的war包複製到Linux中
通過docker命令將宿主機的war包複製到容器內部
docker cp 檔名稱 容器id:容器內部路徑
測試存取SSM工程
爲了部署SSM的工程,需要使用到cp的命令將宿主機內的ssm.war檔案複製到容器內部。 數據卷:將宿主機的一個目錄對映到容器的一個目錄中。
可以在宿主機中操作目錄中的內容,那麼容器內部對映的檔案,也會跟着一起改變。
#建立數據卷後,預設會存放在一個目錄下/var/lib/docker/volumes/數據卷名稱/_data
docker volume create 數據卷名稱
#檢視全部數據卷資訊
docker volume ls
#檢視數據卷的詳細資訊,可以查詢到存放的路徑,建立時間等等
docker volume inspect 數據卷名稱
#刪除指定的數據卷
docker volume rm 數據卷名稱
#通過數據卷名稱對映,如果數據卷不存在。Docker會幫你自動建立,會將容器內部自帶的檔案,儲存在預設的存放路徑中。
docker run -d -p 8080:8080 --name tomcat -v 數據卷名稱:容器內部的路徑 映象id
#通過路徑對映數據卷,直接指定一個路徑作爲數據卷的存放位置。但是這個路徑下是空的。
docker run -d -p 8080:8080 --name tomcat -v 路徑(/root/自己建立的資料夾):容器內部的路徑 映象id
建立自定義映象就需要建立一個Dockerfiler,如下爲Dockerfile的語言
from:指定當前自定義映象依賴的環境
copy:將相對路徑下的內容複製到自定義映象中
workdir:宣告映象的預設工作目錄
run:執行的命令,可以編寫多個
cmd:需要執行的命令(在workdir下執行的,cmd可以寫多個,只以最後一個爲準)
#範例:
from daocloud.io/library/tomcat:8.5.15-jre8
copy ssm.war /usr/local/tomcat/webapps
#編寫完Dockerfile後需要通過命令將其製作爲映象,並且要在Dockerfile的當前目錄下,之後即可在映象中檢視到指定的映象資訊,注意最後的 .
docker build -t 映象名稱[:tag] ./
#去github官網搜尋docker-compose,下載1.24.1版本的Docker-Compose
下載路徑:https://github.com/docker/compose/releases/download/1.24.1/docker-compose-Linux-x86_64
#需要將DockerCompose檔案的名稱修改一下,給予DockerCompose檔案一個可執行的許可權
mv docker-compose-Linux-x86_64 docker-compose
chmod 777 docker-compose
#方便後期操作,設定一個環境變數
#將docker-compose檔案移動到了/usr/local/bin,修改了/etc/profile檔案,給/usr/local/bin設定到了PATH中
mv docker-compose /usr/local/bin
vi /etc/profile
#新增內容:export PATH=$JAVA_HOME:/usr/local/bin:$PATH
source /etc/profile
在任意目錄下輸入docker-compose
yml檔案以key:value方式來指定設定資訊
多個設定資訊以換行+縮排的方式來區分
在docker-compose.yml檔案中,不要使用製表符
version: '3.1'
services:
mysql: # 服務的名稱
restart: always # 代表只要docker啓動,那麼這個容器就跟着一起啓動
image: daocloud.io/library/mysql:5.7.4 # 指定映象路徑
container_name: mysql # 指定容器名稱
ports:
- 3306:3306 # 指定埠號的對映
environment:
MYSQL_ROOT_PASSWORD: root # 指定MySQL的ROOT使用者登錄密碼
TZ: Asia/Shanghai # 指定時區
volumes:
- /opt/docker_mysql_tomcat/mysql_data:/var/lib/mysql # 對映數據卷
tomcat:
restart: always
image: daocloud.io/library/tomcat:8.5.15-jre8
container_name: tomcat
ports:
- 8080:8080
environment:
TZ: Asia/Shanghai
volumes:
- /opt/docker_mysql_tomcat/tomcat_webapps:/usr/local/tomcat/webapps
- /opt/docker_mysql_tomcat/tomcat_logs:/usr/local/tomcat/logs
在使用docker-compose的命令時,預設會在當前目錄下找docker-compose.yml檔案
#1.基於docker-compose.yml啓動管理的容器
docker-compose up -d
#2.關閉並刪除容器
docker-compose down
#3.開啓|關閉|重新啓動已經存在的由docker-compose維護的容器
docker-compose start|stop|restart
#4.檢視由docker-compose管理的容器
docker-compose ps
#5.檢視日誌
docker-compose logs -f
使用docker-compose.yml檔案以及Dockerfile檔案在生成自定義映象的同時啓動當前映象,並且由docker-compose去管理容器
編寫docker-compose檔案
# yml檔案
version: '3.1'
services:
ssm:
restart: always
build: # 構建自定義映象
context: ../ # 指定dockerfile檔案的所在路徑
dockerfile: Dockerfile # 指定Dockerfile檔名稱
image: ssm:1.0.1
container_name: ssm
ports:
- 8081:8080
environment:
TZ: Asia/Shanghai
編寫Dockerfile檔案
from daocloud.io/library/tomcat:8.5.15-jre8
copy ssm.war /usr/local/tomcat/webapps
#可以直接基於docker-compose.yml以及Dockerfile檔案構建的自定義映象
docker-compose up -d
# 如果自定義映象不存在,會幫助我們構建出自定義映象,如果自定義映象已經存在,會直接執行這個自定義映象
#重新構建自定義映象
docker-compose build
#執行當前內容,並重新構建
docker-compose up -d --build
專案部署
1.將專案通過maven進行編譯打包
2.將檔案上傳到指定的伺服器中
3.將war包放到tomcat的目錄中
4.通過Dockerfile將Tomcat和war包轉成一個映象,由DockerCompose去執行容器 專案更新後,需要將上述流程再次的從頭到尾的執行一次,如果每次更新一次都執行一次上述操作,很費時,費力。我們就可以通過CI、CD幫助我們實現持續整合,持續交付和部署
CI(continuous intergration)持續整合
持續整合:編寫程式碼時,完成了一個功能後,立即提交程式碼到Git倉庫中,將專案重新的構建並且測試。
1.快速發現錯誤。
2.防止程式碼偏離主分支。
實現CI,需要使用到Gitlab遠端倉庫,先通過Docker搭建Gitlab
建立一個全新的虛擬機器,並且至少指定4G的執行記憶體,4G執行記憶體是Gitlab推薦的記憶體大小。
並且安裝Docker以及Docker-Compose
#將ssh的預設22埠,修改爲60022埠,因爲Gitlab需要佔用22埠
vi /etc/ssh/sshd_config
PORT 22 -> 60022
systemctl restart sshd
docker-compose.yml檔案去安裝gitlab(下載和執行的時間比較長的)
version: '3.1'
services:
gitlab:
image: 'twang2218/gitlab-ce-zh:11.1.4'
container_name: "gitlab"
restart: always
privileged: true
hostname: 'gitlab'
environment:
TZ: 'Asia/Shanghai'
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://192.168.199.110'
gitlab_rails['time_zone'] = 'Asia/Shanghai'
gitlab_rails['smtp_enable'] = true
gitlab_rails['gitlab_shell_ssh_port'] = 22
ports:
- '80:80'
- '443:443'
- '22:22'
volumes:
- /opt/docker_gitlab/config:/etc/gitlab
- /opt/docker_gitlab/data:/var/opt/gitlab
- /opt/docker_gitlab/logs:/var/log/gitlab
daemon.json
{
「registry-mirrors」: [「https://registry.docker-cn.com」],
「insecure-registries」: [ip:ports]
}
資料夾 environment裏面準備maven安裝包,jdk1.8安裝包,Dockerfile,daemon.json以及docker-compose
建立工作目錄 /usr/local/docker_gitlab-runner
將docker-compose.yml檔案以及environment目錄全部複製到上述目錄中 在宿主機啓動docker程式後先執行 sudo
chown root:root /var/run/docker.sock (如果重新啓動過 docker,重新執行)
在/usr/local/docker_gitlab-runner 目錄中執行docker-compose up -d –build 啓動容器
新增容器許可權,保證容器可以使用宿主機的dockerdocker exec -it gitlab-runner usermod -aG
root gitlab-runner 註冊Runner資訊到gitlab
docker exec -it gitlab-runner gitlab-runner register
# 輸入 GitLab 地址
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://192.168.199.109/
# 輸入 GitLab Token
Please enter the gitlab-ci token for this runner:
1Lxq_f1NRfCfeNbE5WRh
# 輸入 Runner 的說明
Please enter the gitlab-ci description for this runner:
可以爲空
# 設定 Tag,可以用於指定在構建規定的 tag 時觸發 ci
Please enter the gitlab-ci tags for this runner (comma separated):
deploy
# 這裏選擇 true ,可以用於程式碼上傳後直接執行(根據版本,也會沒有次選項)
Whether to run untagged builds [true/false]:
true
# 這裏選擇 false,可以直接回車,預設爲 false(根據版本,也會沒有次選項)
Whether to lock Runner to current project [true/false]:
false
# 選擇 runner 執行器,這裏我們選擇的是 shell
Please enter the executor: virtualbox, docker+machine, parallels, shell, ssh, docker-ssh+machine, kubernetes, docker, docker-ssh:
shell
建立maven工程,新增web.xml檔案,編寫HTML頁面
stages:
- test
test:
stage: test
script:
- echo first test ci # 輸入的命令
執行git命令推播到Gitlab
git push origin master
可以在gitlab中檢視到gitlab-ci.yml編寫的內容
新增Dockerfile以及docker-compose.yml, 並修改.gitlab-ci.yml檔案
# Dockerfile
FROM daocloud.io/library/tomcat:8.5.15-jre8
COPY testci.war /usr/local/tomcat/webapps
# docker-compose.yml
version: "3.1"
services:
testci:
build: docker
restart: always
container_name: testci
ports:
- 8080:8080
# ci.yml
stages:
- test
test:
stage: test
script:
- echo first test ci
- /usr/local/maven/apache-maven-3.6.3/bin/mvn package
- cp target/testci-1.0-SNAPSHOT.war docker/testci.war
- docker-compose down
- docker-compose up -d --build
- docker rmi $(docker images -qf dangling=true)