Docker使用

一、Docker架構圖

image.png

1.1 倉庫
Docker 倉庫用來保存鏡像,可以理解為代碼控制中的代碼倉庫。
1.2 鏡像
Docker 鏡像是用于創(chuàng)建 Docker 容器的模板,類似于Java中類的概念。
1.3 容器
是獨立運行的一個或一組應用。通過鏡像創(chuàng)建生成,類似于Java中的對象概念。

二、Docker安裝

在CentOS上安裝Docker(CentOS版本必須7+)

2.1 安裝前置環(huán)境
yum install -y yum-utils device-mapper-persistent-data lvm2
2.2 設置docker-ce版安裝源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum makecache fast
2.3 安裝docker
yum -y install docker-ce
2.4 啟動/停止docker
systemctl start/stop docker
2.5 基于阿里云配置鏡像加速

登錄網(wǎng)址: https://dev.aliyun.com/

image.png

按照官方的操作文檔修改配置文件即可 <br />注意:如果/etc/docker/daemon.json文件不存在,創(chuàng)建一個即可


image.png

拿到加速地址后:
step1:進入docker目錄下
step2:新建一個文件daemon.json
step3:復制加速地址


image.png

step4:保存后執(zhí)行下面兩個命令
sudo systemctl daemon-reload
sudo systemctl restart docker
image.png

2.6 重啟docker服務

systemctl restart docker

2.7 測試docker服務

docker run hello-world
image.png

三、Docker的基本命令

3.1 鏡像相關的命令

3.1.1 搜索鏡像

docker search [鏡像名稱]

參數(shù)介紹:

-f, --filter 根據(jù)提供的條件過濾器輸出
--format 用Go模板打印出漂亮的搜索結果
--limit [n] 搜索結果的最大數(shù)量(默認值為25)
--no-trunc 不要截斷輸出

3.1.2 拉取鏡像(從倉庫中下載鏡像到本地)

docker pull [鏡像名稱][:標簽]
例子:docker pull tomcat:8

https://hub.docker.com/找docker鏡像資料和版本號
注意:

拉取鏡像時如果沒有顯示的指定tag標簽,默認會拉取latest標簽的版本鏡像

image.png

3.1.3 查看本地鏡像

docker images

參數(shù)介紹:

-q 只顯示鏡像唯一的標識信息

3.1.4 刪除鏡像

docker rmi [鏡像名稱:tag]/[鏡像ID]
例子:
docker rmi tomcat:8
docker rmi f19c56ce92a8
image.png

參數(shù)介紹:

-f 強制刪除鏡像

3.1.5查看容器詳細信息

docker inspect 容器名
例子:docker inspect mysql

3.2 容器相關的命令

3.2.1 根據(jù)鏡像運行容器

docker run [鏡像名稱][:tag]

參數(shù)介紹:
-i 保持和 docker 容器內(nèi)的交互
-t 為容器的標準輸入,虛擬一個tty
-d 后臺運行容器
--rm 容器在啟動后,執(zhí)行完成命令或程序后就銷毀(不可于 -d 一起使用)
--name 給容器起一個自定義名稱
--restart docker 1.12 新增加的參數(shù),用來指定容器的重啟策略, 當前提供的策略包括:
no 默認值,如果容器掛掉不自動重啟。
on-failure,若容器的退出狀態(tài)非0,則docker自動重啟容器,還可以指定重啟次數(shù)
always,只要容器退出,則docker將自動重啟容器
例子:docker run -d --name mytomcat -p 9999:8080 --restart=always tomcat:8
-p 將宿主機中的某個端口映射到容器中的某個端口上
8888:宿主機端口 8080:容器端口

image.png

說明:由于瀏覽器訪問不了tomcat容器里的端口,所以需要宿主機的端口映射到容器中的端口上

3.2.2 查看容器

docker ps

參數(shù)介紹:
-a 查看所有容器(默認不查詢停止的容器)docker ps -a
-q 只查詢?nèi)萜鞯膇d

3.2.3 容器啟動/停止/重啟

docker start/stop/restart 容器名稱

如果重啟出現(xiàn)以下錯誤


image.png

step1:啟動一下docker
systemctl restart docker
重啟后,mytomcat并沒有啟動


image.png

step2:啟動mytomcat
docker start mytomcat
image.png

【測試】訪問


image.png

如果瀏覽器訪問不了tomcat,則修改文件
把webapps.dist里面的文件全部復制到webapps里面
image.png

退出后重啟tomcat:docker restart mytomcat
image.png

3.2.4 查看容器的元數(shù)據(jù)

docker inspect 容器名稱

3.2.5 刪除容器

docker rm 容器名稱

參數(shù)介紹:
-f 表示強制刪除一個容器(默認不能刪除一個運行中的容器)

3.2.6 進入容器中

    docker exec [option] 容器名稱 [args]
    例子:docker exec -it mytomcat bash
    退出容器:exit

參數(shù)介紹:
-i 保持和 docker 容器內(nèi)的交互
-t 為容器的標準輸入,虛擬一個tty
-w 指定進入容器后的工作路徑
args:表示進入容器后執(zhí)行的命令,如果需要和容器進行交互式訪問,需要配置參數(shù)為-it,并且命令設置為bash(表示通過命令行的方式交互訪問容器)
注意:
該命令只能進入到運行中的容器

3.2.7 查看容器運行日志

    docker logs 容器名稱

參數(shù)介紹:
--tail n 選項可以指定查看最后n條日志
-t 選項則可以對日志條目附加時間戳。
--until 顯示在某個時間戳(例如:2018-05-25T 13:23:37)之前的日志,還可以相對時間(例如:42m 42 minutes)
-f 實時打印日志內(nèi)容

3.2.7 宿主機和容器間的數(shù)據(jù)拷貝

    docker cp [OPTIONS] 容器名稱:容器內(nèi)路徑 宿主機路徑 
    docker cp [OPTIONS] 宿主機路徑 容器名稱:容器內(nèi)路徑

例子:
docker cp test.txt mytomcat:/usr/local/tomcat
docker cp mytomcat:/usr/local/tomcat/webapp ./

注意:
1、復制文件夾不需要添加任何參數(shù)(和Linux的命令有區(qū)別)
2、無論從哪里復制,命令都是在宿主機執(zhí)行

3.2.8、查看容器日志

docker logs -f elasticsearch

四、容器數(shù)據(jù)卷

4.1 什么是容器數(shù)據(jù)卷?

數(shù)據(jù)卷存在于宿主機中,獨立于容器,和容器的生命周期是分離的
數(shù)據(jù)卷可以目錄也可以是文件
容器可以利用數(shù)據(jù)卷與宿主機進行數(shù)據(jù)共享,實現(xiàn)了容器間的數(shù)據(jù)共享和交換

image.png

4.2 容器數(shù)據(jù)卷的特點

1、容器啟動時初始化數(shù)據(jù)卷,如果容器使用的鏡像包含了數(shù)據(jù),這些數(shù)據(jù)也會拷貝到數(shù)據(jù)卷中
2、對 數(shù)據(jù)卷 的修改會立馬生效
3、數(shù)據(jù)卷的變化不會影響鏡像的更新
4、數(shù)據(jù)卷是宿主機中的一個目錄

4.3 數(shù)據(jù)卷的運用場景

1、在多個運行容器之間共享數(shù)據(jù)。如果您沒有明確創(chuàng)建它,則會在第一次將其裝入容器時創(chuàng)建卷。當該容器停止或被移除時,該卷仍然存在。多個容器可以同時安裝相同的卷,無論是讀寫還是只讀。僅當您明確刪除卷時才會刪除卷
2、當您想要將容器的數(shù)據(jù)存儲在遠程主機或云提供商上而不是本地時
3、當您需要備份,還原或將數(shù)據(jù)從一臺Docker主機遷移到另一臺時,卷是更好的選擇。您可以停止容器,然后備份卷的目錄

4.4 數(shù)據(jù)卷的相關命令

4.4.1 創(chuàng)建容器數(shù)據(jù)卷

docker volume create 數(shù)據(jù)卷名稱
例子:docker volume create myvolume
image.png

注意
容器卷默認保存在宿主機的/var/lib/docker/volumes路徑下

4.4.2 創(chuàng)建容器時指定數(shù)據(jù)卷

    docker run -it 
        --mount source=數(shù)據(jù)卷名稱,target=容器中的掛載路徑,type=volume 
        --name 容器別名 鏡像名稱

參數(shù)介紹:
source 指定宿主機中數(shù)據(jù)卷的名稱
target 指定容器中對應的掛載路徑
type 指定為數(shù)據(jù)卷的方式掛載,還可以選擇bind、tmpfs,默認為volume

注意:
1、如果掛載一個空的數(shù)據(jù)卷到容器中的一個非空目錄中,那么這個目錄下的文件會被復制到數(shù)據(jù)卷中
2、如果掛載一個非空的數(shù)據(jù)卷到容器中的一個目錄中,那么容器中的目錄中會顯示數(shù)據(jù)卷中的數(shù)據(jù)。如果原來容器中的目錄中有數(shù)據(jù),那么這些原始數(shù)據(jù)會被隱藏掉

4.4.3 直接在創(chuàng)建容器時指定數(shù)據(jù)卷

    docker run  ... [-v 宿主機數(shù)據(jù)卷:docker容器路徑:ro] []...

注意:
1、通過這種方式可以任意指定宿主機的數(shù)據(jù)卷位置
2、如果隨意指定數(shù)據(jù)卷的位置,容器中對應路徑的文件就不會復制到宿主機的數(shù)據(jù)卷中,而是全部被清空
3、:ro表示以只讀的方式掛載容器卷,不寫再表示以讀寫的方式掛載
4、可以通過-v連續(xù)設置多個容器卷路徑

總結:
數(shù)據(jù)卷未顯示聲明路徑(默認在/var/lib/docker/volumes下)
1、數(shù)據(jù)卷為空,對應的容器路徑有數(shù)據(jù),則容器中的數(shù)據(jù)直接同步到數(shù)據(jù)卷中
2、數(shù)據(jù)卷有數(shù)據(jù),對應的容器路徑不存在,則啟動容器時,自動創(chuàng)建該容器路徑,并且將數(shù)據(jù)卷的數(shù)據(jù)同步到該路徑下
3、數(shù)據(jù)卷有數(shù)據(jù),對應的容器路徑也有數(shù)據(jù)(數(shù)據(jù)不同),會把數(shù)據(jù)卷中的數(shù)據(jù)同步到容器路徑中,容器路徑中的文件會被隱藏(宿主機 覆蓋 容器)

例子:
docker run -d --name mytomcat2 -p 9999:8080 -v myvolume:/usr/local/tomcat/webapps.dist tomcat:8
(會把myvolume的數(shù)據(jù)同步到webapps.dist中,而webapps.dist本來的文件會被隱藏)

如果宿主機的數(shù)據(jù)卷為空,容器覆蓋宿主機,如果數(shù)據(jù)卷不為空,則宿主機覆蓋容器

數(shù)據(jù)卷聲明指定路徑

    例子:docker run -d --name mytomcat2 -p 9999:8080 -v /usr/local/abc:/usr/local/tomcat/webapps.dist tomcat:8

1、數(shù)據(jù)卷為空,對應的容器路徑有數(shù)據(jù),則直接將容器路徑中的數(shù)據(jù)隱藏
2、數(shù)據(jù)卷有數(shù)據(jù),對應的容器路徑不存在,則啟動容器時,自動創(chuàng)建該容器路徑,并且將數(shù)據(jù)卷的數(shù)據(jù)同步到該路徑下
3、數(shù)據(jù)卷有數(shù)據(jù),對應的容器路徑也有數(shù)據(jù)(數(shù)據(jù)不同),會把數(shù)據(jù)卷中的數(shù)據(jù)同步到容器路徑中,容器路徑中的文件會被隱藏(宿主機 覆蓋 容器)

無論情況如何,永遠是宿主機 覆蓋 容器路徑
數(shù)據(jù)卷是文件的情況
注意:在執(zhí)行docker run..命令前,myconfig文件夾必須存在,如果不存在,則會把application.yml文件里面的內(nèi)容復制到myconfig中,此時myconfig是一個文件,不是文件夾


image.png
例子:
docker run -d --name mytomcat2 -v /usr/local/myvolume/application.yml:/usr/local/tomcat/webapps/application.yml tomcat:8

1、數(shù)據(jù)卷指定一個文件,對應的容器文件不存在,直接將數(shù)據(jù)卷文件覆蓋到容器中
2、數(shù)據(jù)卷指定的文件不存在,容器的文件存在,啟動容器會報錯
如果需要綁定文件,則必須保證宿主機的數(shù)據(jù)卷中文件必須存在
注意:在數(shù)據(jù)卷修改文件后,需要重啟容器 docker restart mytomcat2

五、Docker的應用

5.1 使用docker安裝MySQL

5.1.1 拉取mysql的鏡像

docker pull mysql:5.7

5.1.2 根據(jù)鏡像創(chuàng)建容器

    docker run -d 
        -v ~/mysql/conf:/etc/mysql/conf.d //2
        -v ~/mysql/logs:/logs //3
        -v ~/mysql/data:/var/lib/mysql //4
        -p 3306:3306 //5
        -e MYSQL_ROOT_PASSWORD='root' //6
        --name mysql
        mysql:5.7

代碼解釋
第二行:掛載mysql配置文件到宿主機
第三行:掛載mysql日志文件到宿主機
第四行:掛載mysql的數(shù)據(jù)路徑到宿主機
第五行:將容器中3306端口映射到宿主機的3306端口上
第六方:設置MySQL的root賬號密碼為root

5.1.3、例子:
step1:在安裝mysql前需要在/usr/local/目錄下先新建一個文件夾mysql_docker
mkdir mysql_docker
step2:安裝MySQL
docker run -d -v /usr/local/mysql_docker/conf:/etc/mysql/conf.d -v /usr/local/mysql_docker/logs:/logs -v /usr/local/mysql_docker/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD='root' --name mysql -p 3306:3306 mysql:5.7
step3:測試是否連接上

image.png

step4:修改數(shù)據(jù)庫編碼格式
在docker安裝的mysql的默認編碼是latinl( 拉丁文),如果插入數(shù)據(jù)會亂碼,需要修改編碼格式
image.png

在conf文件夾下新建my.conf文件

[mysqld]
character-set-server=utf8

image.png

step5:重啟mysql容器 :docker restart mysql
image.png

5.2 使用docker安裝tomcat

5.2.1 拉取tomcat的鏡像

    docker pull tomcat:8

5.2.2 運行tomcat容器

    docker run -d 
        --name tomcat 
        -p 8080:8080 
        -v ~/tomcat/webapps:/usr/local/tomcat/webapps  
        tomcat:8

5.2.3 進入容器中進行相關拷貝

    docker exec -it tomcat bash
    cp -r webapps.dist/* webapps

注意:
docker鏡像tomcat8之后容器中webapps中沒有任何內(nèi)容,需要將歡迎頁導入

5.2.4 將自定義工程部署到tomcat中

1、使用maven命令或者工具將自定義工程打包
2、到工程的target目錄下找到打的war包
3、將war包拷貝到宿主機的tomcat數(shù)據(jù)卷中
4、重啟tomcat容器 docker restart tomcat

六、Docker鏡像的制作與管理

6.1 什么是Dockerfile?

Docker簡單來說就是docker鏡像的描述文件,最基礎原始的鏡像文件都是通過dockerfile文件構建而來

6.2 Dockerfile模板指令介紹

FROM:指定基礎鏡像,必備的指令,并且必須是第一條指令。
MAINTAINER:指明該鏡像的維護者和點子郵件。

比如:MAINTAINER xxxx "xxxxx@qq.com"

ENV:設置環(huán)境變量。

比如:EVN key1=value1 key2=value2...

RUN:在新鏡像內(nèi)部執(zhí)行的命令,比如安裝一些軟件、配置一些基礎環(huán)境,可使用\來換行。

    比如:RUN yum install -y mysql-server

COPY:將主機的文件復制到鏡像文件中,如果目標位置不存在會自動創(chuàng)建。

    比如:COPY application.yml /etc/resources

ADD:和COPY一樣,但是ADD會加上解壓操作
EXPOSE:暴露鏡像的端口供主機做映射,可以暴露多個端口。

    比如:EXPOSE 8080

WORKDIR:在構建鏡像時,指定鏡像的工作目錄,之后的命令都是基于此工作目錄,如果不存在,則會創(chuàng)建目錄,而且在進入容器時,會默認定位到該路徑下。

    比如:WORKDIR /usr/local

VOLUME:用來向基礎鏡像中添加數(shù)據(jù)卷

    比如 VOLUME /root/mydata /root/condata

CMD:容器啟動時需要執(zhí)行的命令。

    比如 CMD /bin/bash
image.png

6.3 案例:使用Dockerfile構建自定義工程的運行鏡像

6.3.1 準備好Dockerfile文件以及需要部署的工程war包

image.png

6.3.2 Dockerfile文件內(nèi)容

    FROM tomcat:8 
    WORKDIR /usr/local/tomcat
    COPY test.war ./webapps
    EXPOSE 8080 
    RUN ./bin/startup.sh 

解釋:
第一行:該鏡像時基于tomcat:8鏡像構建
第二行:設置當前基礎路徑,也是后續(xù)命令的相對路徑
第三行:將工程war包復制到tomcat的webapps路徑下
第四方:對外暴露8080端口,也就是tomcat訪問路徑
第五行:設置容器啟動時命令,即啟動tomcat

6.3.3 通過Dockerfile構建鏡像

執(zhí)行命令

    docker build -f ./Dockerfile -t mytest:v1 .

解釋:
-f 用來指定Dockerfile模板文件
-t 用來指定自定義鏡像的名稱以及tag
最后的.表示當前路徑

6.4 將自定義鏡像推送至鏡像中心(私服、阿里云等,這里以阿里云舉例)

登錄阿里云,并且選擇容器鏡像服務
創(chuàng)建容器倉庫
登錄阿里云的倉庫并且通過命令推送鏡像到阿里云

    docker login --username=賬號 registry.cn-hangzhou.aliyuncs.com
    docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/ken-hub/myhub:[鏡像版本號]
    docker push registry.cn-hangzhou.aliyuncs.com/ken-hub/myhub:[鏡像版本號]

6.5、打war包案例:

step1:新建一個springboot項目,并打war包


image.png

step2:制作鏡像

    FROM tomcat:8
    WORKDIR /usr/local/tomcat
    COPY duckerdemo.war ./webapps
    EXPOSE 8080 
    CMD ["catalina.sh","run"]
image.png

step3:生成容器

    docker build -f ./DockerFile -t myapp:v1 .
image.png

注意war包名一定要一致,否則創(chuàng)建鏡像失敗


image.png

step4:生成容器并測試


image.png

6.6、打jar包案例:

step1:工程打包
注意:如果是打jar包,必須有下面的插件,不然編譯沒問題,運行有問題


image.png

step2:新建文件夾并把jar包拉取到文件夾下


image.png

step3:制作鏡像
    vim DockerFile
    FROM openjdk:8
    WORKDIR /usr/local
    COPY duckerdem.jar ./
    EXPOSE 8080 
    CMD ["java"."-jar","duckerdem.jar"]

step4:與war包步驟相同

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容