Docker學習
一款產品:開發上線 兩套環境!應用環境,應用設定
開發—運維。問題:在我的電腦上可以執行,版本更新,導致服務不可用,對於運維來說,考驗就十分大
環境設定是十分麻煩的,每一個機器都要部署環境(叢集Redis、ES、Hadoop)!費時費力的.
發佈一個專案(jar+(Redis、Mysql、JDK、ES)),專案能否都帶上環境安裝打包!
之前在伺服器設定一個應用的環境Redis、MYSQL、jdk設定超級麻煩,不能跨平臺
傳統:開發jar、運維來做!
現在:開發打包部署上線,一套流程做完!
Dcoker給以上的問題,提出瞭解決方案!
隔離:Docker核心思想!打包裝箱!每個箱子是互相隔離的。
Docker通過隔離機制 機製,可以將伺服器利用到極致!
本質:所有的技術都是因爲出現了一些問題,我們需要去解決,纔去學習!
2010年,幾個搞it的年輕人,在美國成立了一家公司「dotCloud」
做一些pass的雲端計算服務,LXC有關的容器技術
Docker剛剛誕生的時候,沒有引起行業的注意!就將Docker開源化
2013年開源化。
Docker越來越多的人發現Docker的有點,Docker每一個月都會更新一個版本
Docker爲什麼這麼火?十分輕巧
在容器技術出來之前,我們都是使用虛擬機器的技術!
虛擬機器:在Windows裝一個VM,通過這個軟體可以虛擬出來一臺或者多臺電腦!笨重!
虛擬機器也是一種屬於虛擬化技術,Docker容器技術,也是一種虛擬化技術
vm:linux centos原生映象,隔離,需要開啓多個虛擬機器 幾個G
docker:隔離,映象(最核心的映象4m大小 +jdk+mysql)十分的小巧,執行映象就可以了 幾M kb 秒級啓動!
到現在,所有開發人員都必須要會Docker!
聊一聊Docker
Docker是基於Go語言開發的!開源專案!
官網:https://www.docker.com/
文件地址:https://docs.docker.com/ Docker的文件是超級詳細的!
倉庫地址:https://hub.docker.com/
容器化技術
容器化技術不是模擬的一個完整的操作系統
比較Docker和虛擬機器技術的不同:
DevOps(開發、運維)
傳統:一堆幫助文件、安裝程式
Docker:打包映象發佈測試,一鍵執行
使用了Docker之後,我們部署應用就和搭積木一樣!
在容器化之後,我們的開發,測試環境都是高度一致的
Docker是內核級別的虛擬化,可以在我們一個物理機上執行很多的容器範例。伺服器的效能可以被壓榨到極致
映象(image):
docker映象就好像是一個模板,可以通過這個模板來建立容器服務,tomcat映象===>run====>tomcat01容器(提供服務)
通過這個映象可以建立多個容器(最終服務執行或者專案執行就是在容器中)
容器(container):
Docker利用容器技術,獨立執行一個或者一個組應用,通過映象來建立的
啓動、停止、刪除、基本命令
目前就可以吧這個容器理解爲就是一個簡易的linux
倉庫(repository):
倉庫就是存放映象的地方!
倉庫氛圍共有倉庫和私有倉庫
Docker hub(預設是國外的)
阿裡雲都有容器伺服器(設定映象加速)
環境準備
1.需要linux基礎
2.CentOS7
#系統內核是3.10以上
root@hecs-x-medium-2-linux-20200722093047:/# uname -r
4.15.0-91-generic
#系統版本
root@hecs-x-medium-2-linux-20200722093047:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.4 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.4 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
root@hecs-x-medium-2-linux-20200722093047:/# uname -r
4.15.0-91-generic
root@hecs-x-medium-2-linux-20200722093047:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.4 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.4 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
1.解除安裝舊版本Docker
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2.安裝需要的安裝包
sudo yum install -y yum-utils
3.設定映象的倉庫
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4.安裝Docker、docker-ce社羣 ee企業版
yum install docker-ce docker-ce-cli containerd.io
5.啓動docker
systemctl start docker
6.使用docker version是否安裝成功
7.執行hello-world
8.檢視一下下載的hello-world映象
docker images
瞭解:解除安裝docker
1.解除安裝依賴
2.刪除資源
3.設定使用
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://10xg6ow3.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker是一個Clinet-Server結構的系統
1.docker有着比虛擬機器更少的抽象層
2.docker利用的是宿主機的內核,vm需要Guest OS
所以說,新建一個容器的時候,docker不需要跟虛擬機器一樣重新載入一個操作系統內核,避免引導。虛擬機器是載入Guest OS,分鐘級別。Docker是利用宿主機的操作系統,省略了這個複雜的過程,秒級的。
docker version #顯示docker 的詳細資訊
doceker info #顯示docker的系統資訊,包括映象和容器的數量
docker --help #幫忙命令(萬能命令)
幫助文件的地址:https://docs.docker.com/engine/reference/run/
[root@hecs-x-medium-2-linux-20200722093047 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 6 months ago 13.3kB
#解釋
REPOSITORY 映象倉庫源
TAG 映象的標籤
IMAGE ID 映象的id
CREATE 映象的建立時間
SIZE 映象的大小
#可選項
-a, --all Show all images (default hides intermediate images)#列出所有的映象
-q, --quiet Only show numeric IDs #只顯示映象的id
[root@hecs-x-medium-2-linux-20200722093047 ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 9763 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3564 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 717 [OK]
centos/mysql-57-centos7 MySQL 5.7 SQL database server 78
#可選項 通過搜尋來過濾
--filter 過濾
# 下載映象 docker pull 映象名[:tag]
[root@hecs-x-medium-2-linux-20200722093047 ~]# docker pull mysql
Using default tag: latest#如果不寫tag預設是latest
6ec8c9369e08: Pull complete#分層下載。docker image的核心,聯合檔案系統
177e5de89054: Pull complete
ab6ccb86eb40: Pull complete
e1ee78841235: Pull complete
09cd86ccee56: Pull complete
78bea0594a44: Pull complete
caf5f529ae89: Pull complete
cf0fc09f046d: Pull complete
4ccd5b05a8f6: Pull complete
76d29d8de5d4: Pull complete
8077a91f5d16: Pull complete
922753e827ec: Pull complete
Digest: sha256:fb6a6a26111ba75f9e8487db639bc5721d4431beba4cd668a4e922b8f8b14acc
Status: Downloaded newer image for mysql:latest#真實地址
docker.io/library/mysql:latest
#安裝指定版本的mysql
[root@hecs-x-medium-2-linux-20200722093047 ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
6ec8c9369e08: Already exists#聯合檔案系統中會去重
177e5de89054: Already exists
ab6ccb86eb40: Already exists
e1ee78841235: Already exists
09cd86ccee56: Already exists
78bea0594a44: Already exists
caf5f529ae89: Already exists
4e54a8bcf566: Pull complete
50c21ba6527b: Pull complete
68e74bb27b39: Pull complete
5f13eadfe747: Pull complete
Digest: sha256:97869b42772dac5b767f4e4692434fbd5e6b86bcb8695d4feafb52b59fe9ae24
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
#單個刪除映象
[root@hecs-x-medium-2-linux-20200722093047 ~]# docker rmi 8679ced16d20
Untagged: mysql:5.7
Untagged: mysql@sha256:97869b42772dac5b767f4e4692434fbd5e6b86bcb8695d4feafb52b59fe9ae24
Deleted: sha256:8679ced16d206961b35686895b06cfafefde87ef02b518dfc2133081ebf47cda
Deleted: sha256:355f87dc5125a32cc35898a4dde17fb067585bc0d86704b5a467c0ccc0eea484
Deleted: sha256:8299d5c38042216210125535adb2600e46268a0e2b9ec799d12ea5b770236e79
Deleted: sha256:07311a303b2c7cf2ac6992aaf68e12326fe7255985166939cbab7d18b10e0f47
Deleted: sha256:306c9bc1ce2997d000bb6f1ea4108420d9752df93ce39164b7a2f876b954afc4
#刪除多個映象
docker rmi -f 映象id 映象id
#刪除所有映象
docker rmi -f $(docker images -aq)
說明:有了映象纔可以建立容器,下載一個Contos映象來測試學習
docker pull centos
新建容器並啓動
docker run [可選參數] image
#參數說明
--name=「Name」 容器名稱。用於區分容器
-d 後臺方式執行
-it 使用互動方式執行,進入容器檢視內容
-p 指定容器的埠-p:8080:800
主機埠:容器埠
容器埠
-P 隨機指定埠
#測試,啓動並進入容器
[root@hecs-x-medium-2-linux-20200722093047 ~]# docker run -it centos /bin/bash
[root@14237998fa91 /]# ls #檢視容器內的contos
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
列出所有的執行容器
#docker ps 命令
-a #列出當前正在執行的容器,帶出歷史執行的容器
-n=? #顯示最近建立的容器(顯示個數)
-q #只顯示容器的編號
[root@hecs-x-medium-2-linux-20200722093047 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@hecs-x-medium-2-linux-20200722093047 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
14237998fa91 centos "/bin/bash" 6 minutes ago Exited (0) 5 minutes ago relaxed_raman
8b9fce2191c4 centos "/bin/bash" 2 hours ago Exited (127) 10 minutes ago optimistic_jennings
bbdc853e6782 bf756fb1ae65 "/hello" 15 hours ago Exited (0) 15 hours ago blissful_goldstine
[root@hecs-x-medium-2-linux-20200722093047 ~]# docker ps -n=2
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
14237998fa91 centos "/bin/bash" 7 minutes ago Exited (0) 5 minutes ago relaxed_raman
8b9fce2191c4 centos "/bin/bash" 2 hours ago Exited (127) 10 minutes ago optimistic_jennings
退出容器
exit #直接容器停止並退出
ctrl +P+Q #容器不停止退出
刪除容器
docker rm 容器id #刪除指定容器,不能刪除在執行的容器 強制刪除 rm -f
docker rm -f $(docker ps -aq) #刪除所有容器
啓動和停止容器
docker start 容器id #啓動容器
docker restart 容器id #重新啓動容器
docker stop 容器id #停止當前正在執行的容器
docker kill 容器id #強制停止當前容器
常用的其他命令
docker run -d #後臺啓動
[root@hecs-x-medium-2-linux-20200722093047 ~]# docker run -d centos
d4c4d2b11b828faab1d4fd2e1707f48403afb1ce4bd7b561aad5e3bfcf90e185
#問題 docker ps 發現centos停止了
#常見的坑,docker容器使用後臺執行,就必須要有一個前臺進程。doker發現沒有應用,就會自動停止。
#nginx容器啓動後,發現自己沒有提供服務,就會立即停止,就沒有程式了
檢視日誌命令
docker logs
--details Show extra details provided to logs
-f, --follow Follow log output
--since string Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)
--tail string Number of lines to show from the end of the logs (default "all")
-t, --timestamps Show timestamps
--until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)
檢視容器的進程資訊
#docker top 容器id
[root@hecs-x-medium-2-linux-20200722093047 ~]# docker top 70bf5764e384
UID PID PPID C STIME TTY TIME CMD
root 23199 23183 0 16:23 ? 00:00:00 /bin/bash
檢視映象的元數據
#docker inspect
[root@hecs-x-medium-2-linux-20200722093047 ~]# docker inspect 70bf5764e384
進入當前正在執行的容器
#我們通常容器都是使用後臺方式執行的,需要進入容器,修改一定的設定
#命令
docker exec -it 容器id bashshell
[root@hecs-x-medium-2-linux-20200722093047 ~]# docker exec -it 70bf5764e384 /bin/bash
[root@70bf5764e384 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 08:23 pts/0 00:00:00 /bin/bash
root 19 0 0 08:37 pts/1 00:00:00 /bin/bash
root 33 19 0 08:37 pts/1 00:00:00 ps -ef
#方式二
docker attach 容器id
#docker exec #進入容器後開啓一個新的終端,可以在裏面操作(重用)
#docker attach #進入容器正在執行的終端,不會啓動新的進程!
從容器內拷貝檔案到主機上
docker cp 容器id:地址1 地址2
Docker安裝Nginx
# 1.搜尋映象 search
# 2.下載映象 pull
# 3.執行單元測試
[root@hecs-x-medium-2-linux-20200722093047 ~]# docker search nginx
[root@hecs-x-medium-2-linux-20200722093047 ~]# docker pull nginx
[root@hecs-x-medium-2-linux-20200722093047 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 8cf1bfb43ff5 3 days ago 132MB
centos latest 831691599b88 5 weeks ago 215MB
# -d 後臺執行
# --name 給容器命令
# -p 宿主機埠:容器內部埠
[root@hecs-x-medium-2-linux-20200722093047 ~]# docker run -d --name nginx01 -p 3305:80 8cf1bfb43ff5
d8394ed3a4f3c7938267c7a014158e7b7d818cb11a21a5afa7bcddd6b1344695
[root@hecs-x-medium-2-linux-20200722093047 ~]#
[root@hecs-x-medium-2-linux-20200722093047 ~]#
[root@hecs-x-medium-2-linux-20200722093047 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
d8394ed3a4f3 8cf1bfb43ff5 "/docker-entrypoint.…" 3 seconds ago Up 3 seconds 0.0.0.0:3305->80/tcp nginx01
70bf5764e384 centos "/bin/bash" 37 minutes ago Up 37 minutes charming_mcnulty
[root@hecs-x-medium-2-linux-20200722093047 ~]# curl localhost:3305
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
思考問題:每次改動nginx組態檔,都需要進入容器內部。十分麻煩,我們要是可以在容器外部提供一個對映路徑,達到在容器修改檔名,容器內部可以自動修改。
作業2:Docker 裝一個tomcat
1.docker pull tomcat #安裝tomcat
2.[root@hecs-x-medium-2-linux-20200722093047 ~]# docker run -d -p 3355:8080 --name tomcat1 tomcat #執行docker
3.設定安全組
4.存取
#坑:容器內/usr/local/tomcat/webapps下沒有任何專案。都是webapps.list檔案下中。cp webapps.list webapps下
root@19d30c65454d:/usr/local/tomcat/webapps# cp -r webapps.dist/* webapps
portainer(先用這個,圖形化介面工具)
所有的應用,直接打包docker映象,直接跑起來!
如何得到映象
聯合檔案系統
特點
Docker映象都是隻讀的,當容器啓動時,一個新的可讀層被載入到映象額頂部!
這一層就是我們通常說的容器層,容器之下的都叫映象層。
如何提交一個自己的映象
docker commit 提交容器成爲一個新的副本
# 命令和git原理類似
docker commit -m=「提交的描述資訊」 -a=「作者」 容器id 目標映象:【TAG】版本
實戰測試
#1.啓動一個預設的tomcat
[root@hecs-x-medium-2-linux-20200722093047 ~]# docker run -it -d -p 8080:8080 tomcat
#2.發現這個預設的tomcat是沒有webapps應用的,映象的原因,官方的映象預設webapps下面 下麪是沒有檔案的
[root@hecs-x-medium-2-linux-20200722093047 ~]# docker exec -it 6159a7d0aa79 /bin/bash
root@6159a7d0aa79:/usr/local/tomcat# ls
BUILDING.txt CONTRIBUTING.md LICENSE NOTICE README.md RELEASE-NOTES RUNNING.txt bin conf lib logs native-jni-lib temp webapps webapps.dist work
root@6159a7d0aa79:/usr/local/tomcat# cd webapps
root@6159a7d0aa79:/usr/local/tomcat/webapps# ls
root@6159a7d0aa79:/usr/local/tomcat/webapps# cd ..
root@6159a7d0aa79:/usr/local/tomcat# ls
BUILDING.txt CONTRIBUTING.md LICENSE NOTICE README.md RELEASE-NOTES RUNNING.txt bin conf lib logs native-jni-lib temp webapps webapps.dist work
root@6159a7d0aa79:/usr/local/tomcat# cd webapps.dist/
root@6159a7d0aa79:/usr/local/tomcat/webapps.dist# ls
ROOT docs examples host-manager manager
root@6159a7d0aa79:/usr/local/tomcat/webapps.dist# cd .
root@6159a7d0aa79:/usr/local/tomcat/webapps.dist# cd ..
#3.我自己拷貝進去了基本的檔案
root@6159a7d0aa79:/usr/local/tomcat# cp -r webapps.dist/* webapps #將webapps.list下面 下麪的資料夾copy到webapps目錄下
#4.將我們操作過得容器通過commit提交爲一個映象,我們以後就使用我們修改過的映象
docker 的理念回顧
將應用和環境打包成一個映象!
數據?如果數據都在容器中,那麼我們容器刪除,數據就會丟失!需求:數據可以持久化
MYSQL,容器刪了,刪庫跑步。需求:mysql數據可以儲存在本地
容器之間可以有一個數據共用的技術,Docker容器中產生的數據,同步到本地!
這就是卷技術,目錄的掛載,將我們容器的目錄掛載到linux上面。
總結一句話:容器的持久化和同步操作!容器間也是可以數據共用的
方式一:直接使用命令來掛載
docker run -it -v 主機目錄,容器目錄
#測試
[root@hecs-x-medium-2-linux-20200722093047 ~]# docker run -it -d -v /home/ceshi:/home centos /bin/bash
c760f3aa4e190f2316b1bbdb86341ad760389ff34b8840e53753e83e6e34a14c
#啓動起來我們可以用docker inspect檢視
[root@hecs-x-medium-2-linux-20200722093047 ~]# docker inspect c760f3aa4e19
好處:我們以後修改需要在本地修改即可,容器內會自動同步
#1.search mysql
#2.pull mysql
dockerFile是用來構建docker映象的檔案!命令參數指令碼
構建步驟
1.編一個dockerfile檔案
2.docker build 構建成爲一個映象
3.docker run執行徑向
4.docker push發佈映象 (dockerhub、阿裡雲映象倉庫!)
基礎知識:
1.每個保留關鍵字(指令)都是必須大寫字母
2.執行從上到下順序執行
3.#表示註釋
4.每個指令都會建立提交一個新的映象層,並提交!
dockerfile都是面向開發的,我們以後要發佈專案。要做映象,就需要編寫dockerfile檔案,這個檔案十分簡單!
步驟:開發部署
Docker映象逐漸成爲了企業交付的標準,就必須要掌握!
DockerFile:構建檔案,定義了一切步驟,原始碼
DockerImages:通過DockerFile構建生成的映象,最終發佈和執行的產品,原來是jar、war
Docker容器:容器就是映象執行起來提供服務的
很多指令:
FROM #基礎映象,一切從這麼開始構建
MAINTAINER #映象是誰寫的,姓名+郵箱
RUN #映象構建的時候需要執行的命令
ADD #步驟,tomcat映象,這個tomcat壓縮包就是需要新增進去的
WORKDIR #映象的工作目錄
VOLUME #掛載的目錄
EXPOSE #暴露埠
CMD #指定這個容器啓動的時候要執行的命令,只有最後一個生效,可被替代
ENTRYPOINT #指定這個容器啓動的時候要執行的命令,可以追加命令
ONBUILD #當構建一個被繼承的DockerFile這個時候就會執行ONBUILD的指令,觸發指令
COPY #類似ADD,將我們的檔案拷貝到映象中
ENV #構建的時候設定環境變數
Docker Hub中99%映象都是從這個基礎映象過來的 FROM scratch
建立一個自己的Centos
#1.編寫dockerfile的檔案
[root@hecs-x-medium-2-linux-20200722093047 dockerfile]# vim mydockerfile-centos
[root@hecs-x-medium-2-linux-20200722093047 dockerfile]# cat mydockerfile-centos
FROM centos
MAINTAINER luby<[email protected]>
ENV MYPATH /usr/local
WORKDIR MYPATH
run yum -y install vim
run yum -y install net-tools
EXPOSE 80
CMD echo "---end---"
CMD /bin/bash
#2. 構建映象
#命令 docker build -f dockerfile 檔案路徑 -t 映象名:【tag】
[root@hecs-x-medium-2-linux-20200722093047 dockerfile]# docker build -f mydockerfile-centos -t mycentos:1.0 .
#3.測試
[root@69fa0e3d375a MYPATH]# vim ca
CM
ENTRYPOINT:
三個網路:
#問題,docker是如何處理容器網路存取的?
企業實戰
Docker Compose
Docker Swarm
CI/CD Jenkins流水線!