一、Docker簡介
Docker的架構:
-
鏡像(image):Docker鏡像(lmage)就是一個只讀的模板,鏡像可以用來創建Docker容器,一個鏡像可以創建很多容器

-
容器(container):Docker利用容器(Container) 獨立運行的一個或一組應用,**容器是用鏡像創建的運行實體,**它可以被啟動、開始、停止、洗掉,每個容器都是相互隔離的、保證安全的平臺,
-
倉庫(repository):倉庫是集中存放鏡像檔案的場所,倉庫分為公開倉庫(Public) 和私有倉庫(Private) 兩種形式,最大的公開倉庫是Docker Hub(https://hub.docker.com/)存放了數量龐大的鏡像供用戶下載,國內的公開倉庫包括阿里云、網易云等
Docker的架構圖:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-nJfXEywt-1640965352702)(https://gitee.com/jobim/blogimage/raw/master/img/20211224173904.svg)]
docker官網: https://www.docker.com/
docker中文網站: https://www.docker-cn.com/
官方檔案:https://docs.docker.com/
Docker Hub官網:https://hub.docker.com/
二、Docker安裝
作業系統:Centos7.0
官方教程:https://docs.docker.com/engine/install/centos/
2.1 安裝步驟
1、卸載舊版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2、安裝所需的軟體包,yum-utils 提供了 yum-config-manager ,并且 device mapper 存盤驅動程式需要 device-mapper-persistent-data 和 lvm2,
yum install -y yum-utils device-mapper-persistent-data lvm2

3、設定鏡像倉庫(可以使用阿里云鏡像安裝)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4、更新yum軟體包索引
yum makecache fast

5、安裝Docker CE
Docker有兩個分支版本:Docker CE和Docker EE,即社區版和企業版,因為企業版需要官方授權,所以我們一般用社區版
yum -y install docker-ce

6、啟動Docker
systemctl start docker

7、通過運行 hello-world 映像來驗證是否正確安裝了 Docker Engine-Community
docker run hello-world
run干了什么:
2.2 卸載Docker
1、停止Docker
systemctl stop docker
2、洗掉安裝包
yum -y remove docker-ce
2、洗掉鏡像、容器、組態檔等內容
rm -rf /var/lib/docker
2.3 配置阿里云鏡像加速
1、登陸阿里云
阿里云鏡像獲取地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

2、配置鏡像加速器

3、檢查加速器是否生效

三、Docker常用命令
3.1 幫助命令
docker Version
docker info
docker --help
3.2 鏡像命令
1、查看所有本地主機上的鏡像
docker images
-a 列出本地所有的鏡像(含中間映射層)
-q 只顯示鏡像ID
--digests 顯示鏡像的摘要資訊
--no-trunc 顯示完整的鏡像資訊


2、搜索鏡像
docker search [OPTIONS] 鏡像名字
OPTIONS 說明:
--filter,-f:基于給定條件過濾輸出
--format:使用模板格式化顯示輸出
--limit:Max number of search results ,默認值25
--no-trunc:禁止截斷輸出
-
指定列出收藏數不小于指定值的鏡像
docker search -f stars=30 tomcat
-
限制搜索輸出個數
docker search redis --limit 5
| NAME | 鏡像倉庫源的名稱 |
|---|---|
| DESCRIPTION | 鏡像描述 |
| STARS | 類似 Github 里面的 star,表示點贊、喜歡的數量 |
| OFFICIAL | 是否為docker 官方發布的鏡像 |
| AUTOMATED | 自動構建 |
3、下載鏡像
docker pull 鏡像名字[:TAG],如果不寫tag,默認是latest(最新版)
-
下載最新tomcat

-
下載Mysql5.7
docker pull mysql:5.7
4、洗掉鏡像
洗掉指定鏡像:docker rmi -f 鏡像id
洗掉多個鏡像:docker rmi -f 鏡像id 鏡像id 鏡像id
洗掉全部鏡像:docker rmi -f $(docker images -aq)

5、提交鏡像
docker commit 提交容器副本使之稱為一個新的鏡像
docker commit -m="提交的描述資訊" -a="作者" 容器ID 要創建的目標鏡像名:[標簽名]

3.3 容器命令
1、新建并啟動容器
docker run [OPTIONS] IMAGE [COMMAND][ARG]
-
OPTIONS說明(常用) :
- –name=“容器新名字”:為容器指定一個名稱;
- -d:后臺運行容器,并回傳容器ID, 也即啟動守護式容器;
- -i:以互動模式運行容器,通常與-t同時使用;
- -t:為容器重新分配一個偽輸入終端,通常與-i同時使用;
- -P:隨機埠映射;
- -p:指定埠映射,有以下四種格式
- ip:hostPort:containerPort
- ip::containerPort
- hostPort:containerPort
- containerPort
-
創建一個容器,使用鏡像centos ,容器命名為mycentos1228

2、列出當前所有正在運行的容器
docker ps [OPTIONS]
-
OPTIONS說明(常用) :
- -a:列出當前所有正在運行的容器+歷史上運行過的
- -|:顯示最近創建的容器,
- -n:顯示最近n個創建的容器,
- -q:靜默模式,只顯示容器編號,
- –no-trunc:不截斷輸出,
-
顯示最近2個創建的容器

3、退出容器
-
exit,直接停止容器并退出 -
Crtl + Q + P,不停止容器退出
4、洗掉容器
-
docker rm 容器id,洗掉指定的容器,不能洗掉正在運行的容器,如果要強制洗掉rm -f -
docker rm -f $(docker ps -aq),洗掉全部容器
5、啟動和停止容器
-
docker start 容器id,啟動容器 -
docker restart 容器id,重啟容器 -
docker stop 容器id,停止當前正在運行的容器 -
docker kill 容器id,強制停止容器
3.4 其他常用命令
1、在后臺啟動容器
docker run -d centos
注意:docker后臺運行時,必須要有一個前臺行程,如果docker容器發現沒有運行的應用,會自動停止,

2、查看容器的日志
docker logs -tf --tail n(每次顯示日志的行數) 容器id
-
-t 是加入時間戳
-
-f 跟隨最新的日志列印
-
–tail 數字顯示最后多少條

3、查看容器中的行程資訊
docker top 容器id

4、查看鏡像的元資料
docker inspect 容器id

5、進入當前正在運行的容器
-
在使用 -d 引數時,容器啟動后會進入后臺,此時想要進入容器,可以通過以下指令進入
-
docker attach 容器id,直接進入容器啟動命令的終端,不會啟動新的行程 -
docker exec -it 容器ID bashShell,是在容器中打開新的終端,并且可以啟動新的行程
6、把容器內的檔案拷貝到主機
docker cp 容器id:容器內要拷貝的檔案路徑 拷貝到主機的路徑

四、Dockerfile
4.1 DockerFile簡介
Dockerfile是用來構建Docker鏡像的構建檔案,是由一系列命令和引數構成的腳本,
構建三步驟:
-
撰寫Dockerfile檔案:必須符合file規范
-
docker build:
docker build -f /mydocker/Dockerfile -t mrlinxi/centos .通過docker build獲得一個自定義的鏡像 -
docker run
檔案長什么樣?下面就是我們使用的centos的Dockerfile
FROM scratch
ADD centos-7-x86_64-docker.tar.xz /
LABEL \
org.label-schema.schema-version="1.0" \
org.label-schema.name="CentOS Base Image" \
org.label-schema.vendor="CentOS" \
org.label-schema.license="GPLv2" \
org.label-schema.build-date="20201113" \
org.opencontainers.image.title="CentOS Base Image" \
org.opencontainers.image.vendor="CentOS" \
org.opencontainers.image.licenses="GPL-2.0-only" \
org.opencontainers.image.created="2020-11-13 00:00:00+00:00"
# default cmd
CMD ["/bin/bash"]
Dockerfile內容基礎知識:
-
每條保留字指令都必須為大寫字母且后面要跟隨至少一個引數
-
指令按照從上到下,順序執行
-
#表示注釋
-
每條指令都會創建一個新的鏡像層,并對鏡像進行提交
Docker執行Dockerfile的大致流程:
-
(1)docker從基礎鏡像運行一個容器
-
(2)執行一條指令并對容器作出修改
-
(3)執行類似docker commit的操作提交一個新的鏡像層
-
(4)docker再基于剛提交的鏡像運行一個新容器
-
(5)執行dockerfile中的下一條指令直到所有指令都執行完成
4.2 DockerFile體系結構(保留字指令)
FROM:基礎鏡像,當前新鏡像是基于哪個鏡像的,基于什么鏡像進行修改;
MAINTAINER:鏡像維護者的姓名和郵箱地址;
RUN:容器構建時需要運行的命令;
EXPOSE:當前容器對外暴露出的埠;
WORKDIR:指定在創建容器后,終端默認登陸的進來作業目錄,一個落腳點,沒寫默認根目錄/;
ENV:用來在構建鏡像程序中設定環境變數;
-
例如:
ENV MY_PATH /usr/mytest這個環境變數可以在后續的任何RUN指令中使用,這就如同在命令前面指定了環境變數前綴一樣;也可以在其它指令中直接使用這些環境變數, -
比如:
WORKDIR $MY_PATH
ADD:將宿主機目錄下的檔案拷貝進鏡像且ADD命令會自動處理URL和解壓tar壓縮包;
COPY:類似ADD,拷貝檔案和目錄到鏡像中,將從構建背景關系目錄中 <源路徑> 的檔案/目錄復制到新的一層的鏡像內的 <目標路徑> 位置; COPY src dest COPY ["src", "dest"]
- ADD跟COPY的區別在于ADD在復制后會自動解壓縮和處理URL,而COPY僅僅進行復制,
VOLUME:容器資料卷,用于資料保存和持久化作業;
CMD:指一個容器啟動時要運行的命令;Dockerfile 中可以有多個 CMD 指令,但只有最后一個生效,CMD 會被 docker run 之后的引數替換(后面案例會具體說明)

ENTRYPOINT:指定一個容器啟動時要運行的命令;ENTRYPOINT 的目的和 CMD 一樣,都是在指定容器啟動程式及引數;
- CMD與ENTRYPOINT的區別是CMD存在多個時只有最后一個生效以及CMD會被docker run之后的引數替換;而ENTRYPOINT是追加命令,
ONBUILD:當構建一個被繼承的Dockerfile時運行命令,父鏡像在被子繼承后父鏡像的onbuild被觸發
4.3 案例
4.3.1 Base鏡像(scratch)
Docker Hub 中 99% 的鏡像都是通過在 base 鏡像中安裝和配置需要的軟體構建出來的,
4.3.2 自定義鏡像mycentos
-
Hub默認CentOS鏡像什么情況:

自定義mycentos目的使我們自己的鏡像具備如下:
- 登陸后的默認路徑
- vim編輯器
- 查看網路配置ifconfig支持
1、撰寫自定義鏡像的Dockerfile
我們在宿主機的/mydocker檔案夾下,新建一個Dockerfile:vi Dockerfile,寫入下面的內容
FROM centos
MAINTAINER mrlinxi<mrzhme@vip.qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
2、構建自定義鏡像——docker build
docker build -f /mydocker/Dockerfile -t mycentos:1.3 .
build陳述句最后面一個**.**表示當前目錄,

3、運行自定義鏡像——docker run
docker run -it mycentos:0.1

默認目錄是/usr/locl,可以看到我們自己的新鏡像已經支持vim/ifconfig命令,拓展成功
4.3.3 CMD/ENTRYPOINT 鏡像案例
CMD/ENTRYPOINT都是指定一個容器啟動時要運行的命令
CMD鏡像案例:
Dockerfile 中可以有多個 CMD 指令,但只有最后一個生效,CMD 會被 docker run 之后的引數替換,
這里以tomcat為例,tomcat的dockerfile最后一句是CMD ["catalina.sh", "run"]
正常我們啟動tomcat的命令是:docker run -it -p 主機埠:8080 tomcat
現在我們執行這樣一句命令:docker run -it -p 8888:8080 tomcat ls -l
這樣就相當于在tomcat的dockerfile后面又加了一句CMD ls -l,因此會覆寫掉之前的陳述句,

此時tomcat并沒有運行,只是查看了默認路徑下的檔案,

ENTRYPOINT鏡像案例:
docker run 之后的引數會被當做引數傳遞給 ENTRYPOINT,之后形成新的命令組合
4.4 自定義鏡像Tomcat9
1、創建目錄
mkdir /mydocker/tomcat9
在該目錄下新建touch.txt檔案
2、將jdk和tomcat安裝的壓縮包拷貝進上述目錄

3、在tomcat9目錄下新建Dockerfile檔案
FROM centos
MAINTAINER mrzhme<mrzhme@vip.qq.com>
#把宿主機當前背景關系的c.txt拷貝到容器/usr/local/路徑下
COPY c.txt /usr/local/cincontainer.txt
#把java與tomcat添加到容器中
ADD jdk-8u301-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.56.tar.gz /usr/local/
#安裝vim編輯器
RUN yum -y install vim
#設定作業訪問時候的WORKDIR路徑,登錄落腳點
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java與tomcat環境變數
ENV JAVA_HOME /usr/local/jdk1.8.0_301
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.56
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.56
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器運行時監聽的埠
EXPOSE 8080
#啟動時運行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.56/bin/startup.sh" ]
# CMD ["/usr/local/apache-tomcat-9.0.56/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.56/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.56/bin/logs/catalina.out

4、構建鏡像:docker build -t zbtomcat9 .
**注意:**這里為什么沒有加 -f 和 Dockerfile 的路徑?Dockerfile的標準檔案名就是Dockerfile,當當前目錄下用于構建鏡像的Dockerfile的檔案名是標準檔案名時,可以省略-f+路徑,這時Docker會直接讀取當前目錄下名為Dockerfile的檔案進行鏡像的構建,

5、創建容器并啟動
docker run -d -p 9080:8080 --name myt9 -v /zzyyuse/mydockerfile/tomcat9/test:/usr/local/apache-tomcat-9.0.56/webapps/test -v /zzyyuse/mydockerfile/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.56/logs --privileged=true zbtomcat9

可以訪問tomcat的界面

6、結合前述的容器卷將測驗的web服務test發布
cd /mydocker/tomcat9/test
mkdir WEB-INF
-
在test目錄下創建a.jsp檔案,在WEB-INF下創建web.xml檔案
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>test</display-name> </web-app> -
a.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> -----------welcome------------ <%="i am in docker tomcat self "%> <br> <br> <% System.out.println("=============docker tomcat self");%> </body> </html>
-
查看日志資訊

五、Docker常用安裝
5.1 總體步驟
搜索鏡像->拉取鏡像->查看鏡像->啟動鏡像->停止容器->移除容器
docker search xxx -> docker pull xxx:TAG -> docker images xxx -> docker run [-itd -p port:port] [--name yyy] xxx:TAG -> docker stop 容器ID/yyy -> docker rm [-f] yyy
7.2 安裝mysql
docker pull mysql:5.7
docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=10086 \
-d mysql:5.7
命令說明:
-
-p 12345:3306:將主機的3306埠映射到docker容器的3306埠, -
--name mysql:運行服務名字 -
-v /mydata/mysql/conf:/etc/mysql:將主機/mydata/mysql/conf目錄,掛載到容器的/etc/mysql目錄 -
-v /mydata/mysql/data:/var/lib/mysql:將主機的/mydata/mysql/data目錄,掛載到容器的/var/lib/mysql目錄 -
-v /mydata/mysql/log:/var/log/mysql:將主機的/mydata/mysql/log目錄,掛載到容器的/var/log/mysql目錄 -
-e MYSQL_ROOT_PASSWORD=10086:初始化 root 用戶的密碼, -
-d mysql:5.7: 后臺程式運行mysql5.7


7.3 安裝redis
docker pull redis
docker run -p 6379:6379 -v /docker/myredis/data:/data -v /docker/myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis:3.2 redis-server /usr/local/etc/redis/redis.conf --appendonly yes
–appendonly yes 表示使用AOF進行持久化 (redis默認使用rdb進行持久化)
redis.conf是個檔案夾,不是個檔案 (小聲BB:這個redis.conf檔案夾是不是太容易引起歧義了?還有redis-server啟動的時候,后面跟的那串不是指定的組態檔的路徑嗎,講道理redis.conf應該就是個組態檔才對);
在主機/mydata/redis/conf/redis.conf目錄下新建redis.conf檔案
參考博客:Docker基礎 · 語雀
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/400419.html
標籤:其他

