Docker(全)--輕量虛擬機

Docker

官網是這樣介紹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

docker

好比如今想用MySQL,那就找個裝好並配置好的MySQL的容器(能夠認爲是特殊的,輕量級的虛擬機),運行起來,那麼就可使用 MySQL了。mysql

那麼爲何不直接在操做系統中安裝一個mysql,而是用容器呢?linux

安裝MySql過程並不簡單,要配置安裝源,安裝依賴包,對mysql進行配置…若是要在多臺主機上安裝,每臺主機都要進行這些繁瑣的操做,萬一服務器掛了,這一系列操做還要再重來一遍web

但有了docker,一個安裝配置好的mysql容器,能夠直接拿到另外一臺主機上啓動,而沒必要從新安裝mysqlredis

另外,docker還有一重要的用處,就是能夠保證開發,測試和生產環境的一致.spring

Docker.png

docker 手冊

中文免費手冊 [Docker — 從入門到實踐]
https://vuepress.mirror.docker-practice.comsql

docker 從入門到實踐,離線版

docker pull dockerpracticecn/docker_practice
docker run -it --rm -p 4000:80 dockerpracticecn/docker_practice

centos7 安裝docker

離線安裝包

下載離線安裝包
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

yum 在線安裝 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系統服務

啓動 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

Docker

輕量的虛擬機
VMware
完整虛擬一臺計算機,全部的應將、底層系統資源都須要虛擬出來

Docker
充分利用宿主機的硬件和系統資源,本身虛擬的東西很是少
Docker 是開發運維一體化(DevOps)的核心工具

基本概念

鏡像

Docker 鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些爲運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。鏡像不包含任何動態數據,其內容在構建以後也不會被改變。

鏡像只是一個虛擬的概念,其實際體現並不是由一個文件組成,而是由一組文件系統組成,或者說,由多層文件系統聯合組成。

鏡像構建時,會一層層構建,前一層是後一層的基礎。每一層構建完就不會再發生改變,後一層上的任何改變只發生在本身這一層。好比,刪除前一層文件的操做,實際不是真的刪除前一層的文件,而是僅在當前層標記爲該文件已刪除。在最終容器運行的時候,雖然不會看到這個文件,可是實際上該文件會一直跟隨鏡像。所以,在構建鏡像的時候,須要額外當心,每一層儘可能只包含該層須要添加的東西,任何額外的東西應該在該層構建結束前清理掉。

分層存儲的特徵還使得鏡像的複用、定製變的更爲容易。甚至能夠用以前構建好的鏡像做爲基礎層,而後進一步添加新的層,以定製本身所需的內容,構建新的鏡像。

容器

鏡像(Image)和容器(Container)的關係,就像是面向對象程序設計中的 類 和 實例 同樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器能夠被建立、啓動、中止、刪除、暫停等。

容器的實質是進程,但與直接在宿主執行的進程不一樣,容器進程運行於屬於本身的獨立的 命名空間。所以容器能夠擁有本身的 root 文件系統、本身的網絡配置、本身的進程空間,甚至本身的用戶 ID 空間。容器內的進程是運行在一個隔離的環境裏,使用起來,就好像是在一個獨立於宿主的系統下操做同樣。這種特性使得容器封裝的應用比直接在宿主運行更加安全。

前面講過鏡像使用的是分層存儲,容器也是如此。每個容器運行時,是以鏡像爲基礎層,在其上建立一個當前容器的存儲層,咱們能夠稱這個爲容器運行時讀寫而準備的存儲層爲容器存儲層。

容器存儲層的生存週期和容器同樣,容器消亡時,容器存儲層也隨之消亡。所以,任何保存於容器存儲層的信息都會隨容器刪除而丟失。

按照 Docker 最佳實踐的要求,容器不該該向其存儲層內寫入任何數據,容器存儲層要保持無狀態化。全部的文件寫入操做,都應該使用 數據卷(Volume)、或者綁定宿主目錄,在這些位置的讀寫會跳過容器存儲層,直接對宿主(或網絡存儲)發生讀寫,其性能和穩定性更高。

數據卷的生存週期獨立於容器,容器消亡,數據卷不會消亡。所以,使用數據卷後,容器刪除或者從新運行以後,數據卻不會丟失。

docker 鏡像操做

下載 CentOS 鏡像

docker pull centos:7

查看centos7鏡

# 查看鏡像列表
docker images

docker image ls

運行 centos7

# 從 tomcat 鏡像,運行啓動容器
# 參數i: 交互  參數t: 終端
docker run -it xxxx bash
  • xxxx - 鏡像名, 或 image id 的前幾位
  • -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 在後臺運行的標準操做包括:

  • 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
  • 利用鏡像建立並啓動一個容器
  • 分配一個文件系統,並在只讀的鏡像層外面掛載一層可讀寫層
  • 從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去
  • 從地址池配置一個 ip 地址給容器
  • 執行用戶指定的應用程序
  • 執行完畢後容器被終止

容器啓動後運行的應用

鏡像中設置了默認啓動的應用

# 查看鏡像中設置的默認應用
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 後臺運行容器
  • 容器是否會長久運行,是和 docker run 指定的命令有關,和 -d 參數無關。

啓動容器的參數:-d、--name、--rm、--restart=always

# -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

數據管理

在這裏插入圖片描述

在容器中管理數據主要有兩種方式:

  • 數據卷(Volumes)
  • 掛載主機目錄 (Bind mounts)

數據卷

數據卷 是一個可供一個或多個容器使用的特殊目錄

  • 數據卷 能夠在容器之間共享和重用
  • 對 數據卷 的修改會立馬生效
  • 對 數據卷 的更新,不會影響鏡像
  • 數據卷 默認會一直存在,即便容器被刪除

建立數據卷

# 建立數據卷
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 Compose

容器互聯(實施)

# 建立網絡
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

Dockerfile

準備

  • centos:7鏡像
  • jdk壓縮包 jdk-8u212-linux-x64.tar.gz
  • tomcat7壓縮包 apache-tomcat-7.0.96.tar.gz

Dockerfile文件

#以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

使用 Dockerfile 構建鏡像

docker build -t tomcat:7 .
  • 注意末尾的點,表示構建過程當中從當前目錄尋找文件

啓動容器

準備存儲目錄

  • webapps目錄,例如 /opt/webapps
  • logs目錄,例如 /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

構建 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

構建 eureka 鏡像

# 準備文件
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
相關文章
相關標籤/搜索