官網是這樣介紹docker的:html
Docker is an open platform for developers and sysadmins to build, ship, and run distributed applications…vue
其實看完這句話仍是不明白docker到底是什麼java
咱們能夠把他想象成是一個用了一種新穎方式實現的超輕量虛擬機。固然在實現的原理和應用上仍是和VM有巨大差異的,而且專業的叫法是應用容器(Application Container)。node
好比如今想用MySQL,那就找個裝好並配置好的MySQL的容器(能夠認爲是特殊的,輕量級的虛擬機),運行起來,那麼就可使用 MySQL了。mysql
那麼爲何不直接在操做系統中安裝一個mysql,而是用容器呢?linux
安裝MySql過程並不簡單,要配置安裝源,安裝依賴包,對mysql進行配置…若是要在多臺主機上安裝,每臺主機都要進行這些繁瑣的操做,萬一服務器掛了,這一系列操做還要再重來一遍web
但有了docker,一個安裝配置好的mysql容器,能夠直接拿到另外一臺主機上啓動,而沒必要從新安裝mysqlredis
另外,docker還有一重要的用處,就是能夠保證開發,測試和生產環境的一致.spring
中文免費手冊 [Docker — 從入門到實踐]
https://vuepress.mirror.docker-practice.comsql
docker 從入門到實踐,離線版
docker pull dockerpracticecn/docker_practice docker run -it --rm -p 4000:80 dockerpracticecn/docker_practice
下載離線安裝包
https://download.csdn.net/download/weixin_38305440/12265961
上傳離線安裝包
docker-install
目錄上傳到 /root
切換到docker-install
目錄
cd docker-install
安裝
rpm -ivh *.rpm
設置系統服務
systemctl enable docker
啓動docker系統服務
systemctl start docker
https://docs.docker.com/install/linux/docker-ce/centos/
卸載舊版
sudo yum remove docker-ce docker-ce-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
安裝一組工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
設置 yum 倉庫地址
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
更新 yum 緩存
sudo yum makecache fast
安裝新版 docker
sudo yum install -y docker-ce docker-ce-cli containerd.io
啓動 docker
sudo systemctl start docker
設置 docker 開機啓動
sudo systemctl enable docker
因爲國內網絡問題,須要配置加速器來加速。
修改配置文件 /etc/docker/daemon.json
下面命令直接生成文件 daemon.json
cat <<EOF > /etc/docker/daemon.json { "registry-mirrors": [ "https://dockerhub.azk8s.cn", "https://hub-mirror.c.163.com" ] } EOF
以後從新啓動服務。
# 從新加載docker配置 sudo systemctl daemon-reload #重啓docker服務 sudo systemctl restart docker
查看鏡像配置
docker info
運行 hello-world 鏡像,驗證 docker
sudo docker run hello-world
輕量的虛擬機
VMware
完整虛擬一臺計算機,全部的應將、底層系統資源都須要虛擬出來
Docker
充分利用宿主機的硬件和系統資源,本身虛擬的東西很是少
Docker 是開發運維一體化(DevOps)的核心工具
Docker 鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些爲運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。鏡像不包含任何動態數據,其內容在構建以後也不會被改變。
鏡像只是一個虛擬的概念,其實際體現並不是由一個文件組成,而是由一組文件系統組成,或者說,由多層文件系統聯合組成。
鏡像構建時,會一層層構建,前一層是後一層的基礎。每一層構建完就不會再發生改變,後一層上的任何改變只發生在本身這一層。好比,刪除前一層文件的操做,實際不是真的刪除前一層的文件,而是僅在當前層標記爲該文件已刪除。在最終容器運行的時候,雖然不會看到這個文件,可是實際上該文件會一直跟隨鏡像。所以,在構建鏡像的時候,須要額外當心,每一層儘可能只包含該層須要添加的東西,任何額外的東西應該在該層構建結束前清理掉。
分層存儲的特徵還使得鏡像的複用、定製變的更爲容易。甚至能夠用以前構建好的鏡像做爲基礎層,而後進一步添加新的層,以定製本身所需的內容,構建新的鏡像。
鏡像(Image)和容器(Container)的關係,就像是面向對象程序設計中的 類 和 實例 同樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器能夠被建立、啓動、中止、刪除、暫停等。
容器的實質是進程,但與直接在宿主執行的進程不一樣,容器進程運行於屬於本身的獨立的 命名空間。所以容器能夠擁有本身的 root 文件系統、本身的網絡配置、本身的進程空間,甚至本身的用戶 ID 空間。容器內的進程是運行在一個隔離的環境裏,使用起來,就好像是在一個獨立於宿主的系統下操做同樣。這種特性使得容器封裝的應用比直接在宿主運行更加安全。
前面講過鏡像使用的是分層存儲,容器也是如此。每個容器運行時,是以鏡像爲基礎層,在其上建立一個當前容器的存儲層,咱們能夠稱這個爲容器運行時讀寫而準備的存儲層爲容器存儲層。
容器存儲層的生存週期和容器同樣,容器消亡時,容器存儲層也隨之消亡。所以,任何保存於容器存儲層的信息都會隨容器刪除而丟失。
按照 Docker 最佳實踐的要求,容器不該該向其存儲層內寫入任何數據,容器存儲層要保持無狀態化。全部的文件寫入操做,都應該使用 數據卷(Volume)、或者綁定宿主目錄,在這些位置的讀寫會跳過容器存儲層,直接對宿主(或網絡存儲)發生讀寫,其性能和穩定性更高。
數據卷的生存週期獨立於容器,容器消亡,數據卷不會消亡。所以,使用數據卷後,容器刪除或者從新運行以後,數據卻不會丟失。
docker pull centos:7
# 查看鏡像列表 docker images
或
docker image ls
# 從 tomcat 鏡像,運行啓動容器 # 參數i: 交互 參數t: 終端 docker run -it xxxx bash
-it
這是兩個參數,一個是 -i:交互式操做,一個是 -t 終端。咱們這裏打算進入 bash 執行一些命令並查看返回結果,所以咱們須要交互式終端。bash
放在鏡像名後的是命令,這裏咱們但願有個交互式 Shell,所以用的是 bash。501
鏡像 id 前幾位,通常三位以上,足夠區分便可docker image rm 501 docker rmi hello-world docker rmi aaaaa bbbbb cccccc dddd docker rmi id1 id2 id3 # 若是存在容器,不能直接刪除鏡像,能夠加 -f 參數強制刪除鏡像 docker rmi -f hello-world
docker image rm centos
docker save mysql:5.7 node:8 | gzip > app.tar.gz
docker load < apps.tar.gz
# 參數i: 交互 參數t: 終端 docker run -it centos:7 bash # 查看正在運行的容器 docker ps # 查看全部容器,包括已關閉的容器 docker ps -a # 中止或重啓容器 docker stop 0c6 docker start 0c6 docker restart 0c6
當利用 docker run 來建立容器時,Docker 在後臺運行的標準操做包括:
鏡像中設置了默認啓動的應用
# 查看鏡像中設置的默認應用 docker history tomcat docker history redis docker history mariadb
若是不想執行鏡像指定的默認命令,也能夠本身指定任意命令
docker run -it tomcat ls docker run -it tomcat top docker run -it tomcat bash docker ps -a
docker run -dit centos:7
-d
後臺運行容器# -d 後臺運行,不佔用控制檯 # --name 給容器命名 docker run -d --name cat1 tomcat docker ps # 查看容器內部日誌 docker logs cat1 # --rm 容器關閉時,自動刪除容器 docker run -it --rm tomcat top # ctrl+c 退出後,容器自動關閉,自動刪除,查看容器列表是看不到容器的 docker ps -a # --restart=always 容器老是自動啓動 docker run -d --name cat2 --restart=always tomcat docker ps # 重啓docker系統服務,cat2也會自動重啓,cat1不會自動啓動 systemctl restart docker docker ps
docker container logs 802
docker container ls -a # 或 docker ps -a
-a
all, 所有docker container stop 802
docker container restart 802
在使用 -d 參數時,容器啓動後會進入後臺。
某些時候須要進入容器進行操做,可使用 docker exec
命令
docker exec -it 802 bash docker exec -it cat2 pwd docker exec -it cat2 ps docker exec -it cat2 touch f1.txt docker exec -it cat2 ls docker exec -it cat2 bash
docker container rm 802 docker rm 9aa f94 # 不能直接刪除正在運行的容器,能夠加 -f 強制刪除 docker rm -f 0c6 # 清理全部已經退出的容器 docker container prune
-f
參數docker container prune
在容器中管理數據主要有兩種方式:
數據卷 是一個可供一個或多個容器使用的特殊目錄
# 建立數據卷 docker volume create my-vol
# 查看數據卷 docker volume ls
# 查看數據卷詳情 /var/lib/docker/volumes/my-vol/_data docker volume inspect my-vol
查詢的結果:
[ { "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/my-vol/_data", "Name": "my-vol", "Options": {}, "Scope": "local" } ]
docker run -it --mount source=my-vol,target=/webapp centos:7 bash # 或者: docker run -it -v my-vol:/webapp centos:7 bash
-v my-vol:/webapp
把數據卷 my-vol 掛載到容器的 /webapp 目錄docker volume rm my-vol
docker volume prune
# 建立數據卷 docker volume create my-vol # 查看數據卷 docker volume ls # 查看數據卷詳情 /var/lib/docker/volumes/my-vol/_data docker inspect my-vol # 把 my-vol 數據卷掛載到容器 docker run \ -d --name cat2 \ --rm \ -v my-vol:/opt/app \ tomcat # 在容器 cat2 的 /opt/app/ 下建立文件 docker exec -it cat2 touch /opt/app/f2.txt docker exec -it cat2 ls /opt/app/ # 在宿主機 my-vol 數據卷的目錄下查看文件 cd /var/lib/docker/volumes/my-vol/_data ls
docker run -it --mount type=bind,source=/usr/app,target=/opt/app centos:7 bash # 或 docker run -it -v /usr/app:/opt/app centos:7 bash
-v
若是本地目錄不存在 Docker 會自動爲你建立一個文件夾--mount
參數時若是本地目錄不存在,Docker 會報錯docker inspect 91a
顯示結果:
... "Mounts": [ { "Type": "bind", "Source": "/usr/app", "Destination": "/opt/app", "Mode": "", "RW": true, "Propagation": "rprivate" } ], ...
# -v /usr/app:/opt/app # -v 宿主機目錄:容器中的路徑 # 宿主機目錄不存在會自動建立 docker run \ -d \ --name cat1 \ -v /usr/app:/opt/app \ tomcat # 進入cat1容器,在 /opt/app/ 目錄下建立文件 docker exec -it cat1 bash cd /opt/app/ echo 111111111111111 > f1.txt ls cat f1.txt # 退回到宿主機,查看保存在宿主機的文件 exit cd /usr/app/ ls cat f1.txt
docker run -d -P tomcat # 查看容器信息 docker container ls -a
顯示結果:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d03480b1a781 tomcat "catalina.sh run" 3 minutes ago Up 3 minutes 0.0.0.0:32768->8080/tcp trusting_gagarin
docker run -d -p 8080:8080 tomcat
8080:8080
本機端口:容器端口docker run -d -p 5000:5000 -p 80:8080 tomcat
docker run -d -p 192.168.64.150:8080:8080 tomcat
docker run -d -p 192.168.64.150::8080 tomcat
docker port 8af
# 清理容器 docker rm -f cat1 cat2 # 建立 tomcat 容器,映射到宿主機的80端口 docker run \ -d --name cat1 \ --restart=always \ -p 80:8080 \ tomcat # 訪問 http://192.168.64.150 # 在宿主機建立 /opt/web/index.html mkdir /opt/web/ cat <<EOF >/opt/web/index.html <h1>Hello docker!!!</h1> EOF # 啓動容器 cat2 docker run -d --name cat2 \ --restart=always \ -v /opt/web:/usr/local/tomcat/webapps/ROOT \ -p 8088:8080 \ tomcat # 訪問 http://192.168.64.150:8088
docker network create -d bridge my-net
-d
driver,網絡類型,默認 bridge,也能夠是 overlay(Swarm mode)docker network ls
docker inspect 67d
docker run -it --name app1 --network my-net centos:7
新開終端執行:
docker run -it --name app2 --network my-net centos:7
在兩個終端中分別執行:
ping app1 ping app2
顯示以下:
[root@35569c623c4c /]# ping app1 PING app1 (172.18.0.2) 56(84) bytes of data. 64 bytes from 35569c623c4c (172.18.0.2): icmp_seq=1 ttl=64 time=0.577 ms 64 bytes from 35569c623c4c (172.18.0.2): icmp_seq=2 ttl=64 time=0.061 ms 64 bytes from 35569c623c4c (172.18.0.2): icmp_seq=3 ttl=64 time=0.066 ms ......
# 建立網絡 docker network create my-net # 查看網絡 docker network ls # 查看網絡詳情 docker inspect my-net # 查看宿主機上新建的虛擬網卡 ifconfig # 啓動容器 app1,鏈接到my-net網絡 docker run -dit --name app1 \ --net my-net \ centos:7 # 啓動容器 app2,鏈接到my-net網絡 docker run -dit --name app2 \ --net my-net \ centos:7 # 查看容器描述,能夠看到得到的ip地址 docker inspect app1 docker inspect app2 # 從宿主機ping app1和app2的ip ping 172.18.0.2 ping 172.18.0.3 # 進入 app1,ping宿主機和app2 docker exec -it app1 ping 172.18.0.1 docker exec -it app1 ping 172.18.0.3 docker exec -it app1 ping app2
jdk-8u212-linux-x64.tar.gz
apache-tomcat-7.0.96.tar.gz
#以centos7爲基礎,安裝oracle jdk8和tomcat7 FROM centos:7 #ADD命令將壓縮包傳入鏡像中的指定目錄,並同時解壓縮 ADD jdk-8u212-linux-x64.tar.gz /opt/ ADD apache-tomcat-7.0.96.tar.gz /usr/ #爲了方便,把文件夾名稱改得簡單一點 RUN mv /usr/apache-tomcat-7.0.96 /usr/tomcat #設置環境變量 ENV JAVA_HOME=/opt/jdk1.8.0_212 CATALINA_HOME=/usr/tomcat PATH=$PATH:/opt/jdk1.8.0_212/bin:/usr/tomcat/bin #暴露容器的8080端口 EXPOSE 8080 #設置啓動容器時自動運行tomcat ENTRYPOINT /usr/tomcat/bin/startup.sh && tail -F /usr/tomcat/logs/catalina.out
FROM centos:7 ADD jdk-8u212-linux-x64.tar.gz /opt/ ADD apache-tomcat-7.0.96.tar.gz /usr/ RUN mv /usr/apache-tomcat-7.0.96 /usr/tomcat ENV JAVA_HOME=/opt/jdk1.8.0_212 \ CATALINA_HOME=/usr/tomcat \ PATH=$PATH:/opt/jdk1.8.0_212/bin:/usr/tomcat/bin EXPOSE 8080 ENTRYPOINT /usr/tomcat/bin/startup.sh && tail -F /usr/tomcat/logs/catalina.out
docker build -t tomcat:7 .
/opt/webapps
/var/lib/tomcat-logs
mkdir /opt/webapps mkdir /opt/webapps/ROOT mkdir /var/lib/tomcat-logs # 添加歡迎頁 cat <<EOF > /opt/webapps/ROOT/index.html <h1>Hello Docker!!!</h1> EOF
docker run -d -p 8080:8080 --name tomcat7 -v /opt/webapps:/usr/tomcat/webapps -v /var/lib/tomcat-logs:/usr/tomcat/logs tomcat:7
# 新建文件夾 tomcat7 cd ~/ mkdir tomcat7 # 生成 Dockerfile 文件 cd tomcat7 cat <<EOF >Dockerfile FROM centos:7 ADD jdk-8u212-linux-x64.tar.gz /opt/ ADD apache-tomcat-7.0.96.tar.gz /usr/ RUN mv /usr/apache-tomcat-7.0.96 /usr/tomcat ENV JAVA_HOME=/opt/jdk1.8.0_212 \ CATALINA_HOME=/usr/tomcat \ PATH=$PATH:/opt/jdk1.8.0_212/bin:/usr/tomcat/bin EXPOSE 8080 ENTRYPOINT /usr/tomcat/bin/startup.sh && tail -F /usr/tomcat/logs/catalina.out EOF # 上傳 jdk 和 tomcat7 的壓縮文件到 /root/tomcat7/ # 完成構建,末尾的點,是當前目錄(/root/tomcat7/) docker build -t tomcat:7 . # 查看鏡像列表 docker images # 從 tomcat:7 鏡像,運行啓動容器 docker run -d --name cat3 \ -p 8089:8080 \ tomcat:7 docker logs cat3 http://192.168.64.150:8089
# 準備文件 cd ~/ mkdir eureka cd eureka # 上傳文件 jdk 和 eureka 的 jar 文件到 /root/eureka/ 文件夾 # jdk文件: 課前資料/docker/tomcat7/ # java -jar /opt/sp05-eureka-0.0.1-SNAPSHOT.jar # --spring.profiles.active=eureka1 --server.port=2001 cat <<EOF >Dockerfile FROM centos:7 ADD jdk-8u212-linux-x64.tar.gz /opt/ COPY sp05-eureka-0.0.1-SNAPSHOT.jar /opt/ ENV JAVA_HOME=/opt/jdk1.8.0_212 \ PATH=$PATH:/opt/jdk1.8.0_212/bin ENTRYPOINT ["java", "-jar", "/opt/sp05-eureka-0.0.1-SNAPSHOT.jar"] CMD ["--spring.profiles.active=eureka1", "--server.port=2001"] EOF docker build -t eureka:v1 . # 啓動 eureka 容器 docker run -d --name eureka1 \ --restart=always \ -p 2001:2001 \ eureka:v1 docker logs eureka1