Docker簡介
Docker是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的鏡像中,然後發佈到任何流行的 Linux或Windows 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口
Docker優勢
持續集成、版本控制、可移植性、隔離性和安全
Docker的組成
鏡像(image):
Docker鏡像就相當於是一個文件系統,通俗來說就是為容器用來創建容器的
容器(Container):
Docker 利用容器 (Container) 獨立運行的一個或一組應用,容器是用鏡像創建的運行實例,它可以被啟動、開始、停止、刪除,每個容器都是相互隔離的、保證安全的平臺,可以把容器看做是一個簡易版的Linux系統
容器就相當於Java中的對象,鏡像相當於Java中的類
倉庫(Repository)
倉庫是集中存放鏡像文件的場所
倉庫註冊服務器 (Registry) 上往往存放著多個倉庫,每個倉庫中又包含了多個鏡像,每個鏡像有不同的標籤
倉庫分為公開倉庫和私有倉庫兩種形式
最大的公開倉庫是DockerHub存放了數量龐大的鏡像供用戶下載,國內的公開倉庫包括阿里雲等
Docker的底層原理
Docker的工作原理
Docker是基於C/S結構的系統,Docker的守護進程運行在Linux服務器(宿主機)上,當我們在Liunx服務器上(Docker-Client)輸入Docker相關命令就會被髮送給Doker-Server
為什麼Docker比VM(虛擬機)快
1、Docker有著比虛擬機更少的抽象層,由於Docker不需要Hypervisor實現硬件資源虛擬化,運行在Docker容器上的程序直接使用的都是實際物理機的硬件資源,因此在CPU、內存利用率上docker將會在效率上有明顯優勢
2、當新建一個容器時,Docker不需要和虛擬機一樣重新加載一個操作系統內核,因而避免引導、加載操作系統內核返個比較費時費資源的過程,當新建一個虛擬機時,虛擬機軟件需要加載GuestOS(虛擬機中的操作系統),這個新建過程是分鐘級別的,而Docker由於直接利用宿主機的操作系統,則省略了這個複雜的過程,因此新建一個Docker容器只需要幾秒鐘
Docker的安裝
1.需要Liunx版本為CentOS7.0以上
2.卸載舊版本(非必須項)
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
3.安裝Docker所需要依賴
yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
4.設置鏡像倉庫
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
5.安裝Docker
yum -y install docker-ce
6.設置阿里雲鏡像加速
)
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://qhyb8ixp.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
7.開啟Dcoker服務
service docker start
8.測試Docker-HelloWorld程序
[root@iZ8vbi9mx98t2s78lyxfpuZ ~]# docker run hello-world
Unable to find image 'hello-world:latest' locally
docker run hello-worldlatest: Pulling from library/hello-world
0e03bdcc26d7: Already exists
Digest: sha256:6a65f928fb91fcfbc963f7aa6d57c8eeb426ad9a20c7ee045538ef34847f44f1
Status: Downloaded newer image for hello-world:latest
Hello from Docker! --> 出現這句話代表Docker安裝沒有問題
This message shows that your installation appears to be working correctly.
9.卸載Docker
#1. 卸載依賴
yum remove docker-ce docker-ce-cli containerd.io
#2. 刪除資源 /var/lib/docker 是docker的默認工作路徑!
rm -rf /var/lib/docker
Docker幫助命令
1. docker version # 顯示Docker的版本信息
2. docker info # 顯示Docker的系統信息(包含鏡像與容器的數量)
3. docker 命令 --help # 查看幫助(就是顯示這個命令有什麼可選項)
Docker鏡像命令
-
docker images:顯示本機上所有安裝鏡像
[root@MT ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 470671670cac 4 months ago 237MB hello-world latest bf756fb1ae65 4 months ago 13.3kB # 可選項 docker images -a # 列出所有的鏡像 docker images -q # 只顯示鏡像的id [root@MT ~]# docker images -aq 470671670cac bf756fb1ae65
-
docker search:搜索鏡像
[root@MT ~]# docker search mysql(鏡像名) NAME DESCRIPTION STARS mysql MySQL is a widely used, open-source relation… 9553 mariadb MariaDB is a community-developed fork of MyS… 3471 # 可選項 docker search mysql -f=STARS=3000 # 列出鏡像星數大於3000的鏡像
-
docker pull:下載鏡像
[root@MT ~]# docker pull mysql # 下載最新版本的MySQL [root@MT ~]# docker pull mysql:5.7 # 下載指定版本的MySQL
-
docker rmi:刪除鏡像
docker rmi -f 鏡像id # 刪除指定的鏡像 docker rmi -f 鏡像id 鏡像id 鏡像id 鏡像id # 刪除指定的鏡像 docker rmi -f $(docker images -aq) # 刪除全部的鏡像
Docker容器命令
-
docker run [可選參數] 鏡像名
[root@MT ~]# docker run 可選參數 鏡像名 # 可選參數 --name=”xxx“ # 容器名字 -d # 後臺模式運行 -it # 使用交互模式運行,進入容器查看內容 -p(小學) # 指定端口映射 如:-p 8080(宿主機):8080(容器) -P(大寫) # 隨機端口映射 # 測試啟動進入與退出容器 [root@MT ~]# docker run -it centos /bin/bash # /bin/bash 是使用命令行進入 [root@6130f0353526 /]# ls # 此時已經進入Docker的CentOS容器 bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@6130f0353526 /]# exit exit [root@MT ~]#
-
docker ps [可選參數]:列出運行的容器
[root@MT ~]# docker ps 可選參數 # 可選參數 -a # 列出正在運行和歷史運行過的容器 -q # 列出容器ID [root@MT ~]# docker ps -aq 6130f0353526 895577bc1ae7 f9fc9c23267d faab3fceb1d3
-
退出容器
exit # 容器直接退出 Ctrl + P + Q # 容器不停止退出
-
刪除容器
docker rm -f 容器id # 刪除指定容器(不能刪除正在運行的,如需要rm-rf) docker rm -f $(docker ps -aq) # 刪除所有容器
-
啟動和停止容器操作
docker start 容器id # 啟動容器 docker restart 容器id # 重啟容器 docker stop 容器id # 停止正在運行的容器 docker kill 容器id # 強制停止
Docker其它命令
容器後臺方式運行
[root@MT ~]# docker run -d centos
748d11ff226983ab8281fc6741087e6a3f349ad03f0cadafcd215aed894978dc
[root@MT ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 問題:我們此時已經發現啟動CentOS,但是確查不到正在運行的容器
# 解釋:Docker容器使用後臺運行,就必須要有要一個前臺進程,Docker發現沒有應用,就會自動停止
查看日誌
docker logs -tf 容器id # 查看實時日誌
docker logs -t --tail 數量 容器id # 查看指定數量的日誌
查看容器中的進程信息
docker top 容器id
查看鏡像的元數據
docker inspect 容器id
進入當前正在運行的容器
# 通常我們是使用後臺方式運行容器,因為我們可能需要進入容器,修改配置
# docker exec -it 容器ID /bin/bash (常用)
# docker attach 容器ID
# exec方式:就是類似新開一個窗口連接運行的容器
# attach方式:就是直接連入當前的容器
拷貝容器內文件到宿主機中
docker cp 容器id:文件路徑(容器內) 目的路徑(宿主機)
[root@MT ~]docker cp 1a9a6785c37c:/home/c.java /home/
Docker安裝Nginx
# 1. 搜索鏡像 search 建議大家去docker搜索,可以看到幫助文檔
docker search nginx
# 2. 拉取鏡像 docker pull nginx
docker pull nginx
# 3. 運行測試
# -d 後臺運行
# --name 給容器命名
# -p 宿主機端口:容器內部端口(我這裡使用阿里雲的3344端口,前提要在阿里雲安全組開放次端口)
docker run -d --name nginx -p 3344:80 nginx
# 4.查看鏡像
docker ps
# 5.測試是否成功
curl localhost:3344 # 或者在瀏覽器輸入ip:3344
Docker安裝Tomcat
# 下載tomcat鏡像
docker pull tomcat:9.0
# 運行tomcat鏡像
docker run -d tomcat -p 3344:8080 tomcat
# 測試
curl localhost:3344 # 此時發現無法訪問
# 原因:tomcat容器裡面webapps目錄下沒有文件
# 進入容器
docker exec -it ef41045bea2b /bin/bash
cp -r webapps.dist/* webapps
# 重新測試 在瀏覽器輸入ip:3344 --> 發現成功訪問