架構
- 鏡像:docker鏡像,就相當於是一個root文件系統,比如官方鏡像像ubuntu就包含了一套完整的ubuntu最小系統的root文件系統
- 容器:鏡像和容器的關係,就像是面向對象程序設計中的類和實例一樣,鏡像是靜態的定義,容器是鏡像運行時的實體.容器可以被創建 啓動 停止 刪除和暫停等
- 倉庫:倉庫可以被看一個代碼控制中心,用來保存鏡像
docker使用客戶端 服務器架構模式,使用遠程api來管理和創建docker容器.docker容器通過docker鏡像來創建
概念 | 說明 |
---|---|
docker鏡像(images) | docker鏡像是用於創建docker容器的模板,比如ubuntu系統 |
docker容器(container) | 容器是獨立運行的一個或一組應用,是鏡像運行的實體 |
docker客戶端(client) | docker客戶端通過命令行或者其他工具使用docker sdk與docker的守護進行通信 |
docker主機(host) | 一個物理或者虛擬的機器用於執行docker守護進程和容器 |
docker registry | docker倉庫用來保存鏡像,可以理解爲代碼控制中的代碼倉庫,docker hub提供了龐大的鏡像集合供使用.一個docekr registry中可以包含多個倉庫,每個倉庫可以包含多個標籤,每個標籤對應一個鏡像,通常,一個倉庫會包含同一個軟件不同版本的進行,而標籤就常用於對應該軟件的各個版本.我們可以通過[倉庫名]:[標籤]的格式來指定具體是這個軟件那個版本的鏡像.如果不給出標籤,將以latest作爲默認標籤 |
docker machine | docker machine是一個簡化docekr安裝的命令行工具,通過一個簡單的命令行即可在對應的平臺上安裝docker比如virtualbox digital ocean microsoft azure |
docker使用
docker helloworld
docker允許你在容器內運行應用程序.在容器內運行一個應用程序並輸出helloworld
docker run ubuntu:15.10 /bin/echo "Hello world"
- docker:docker的二進制執行文件
- run:與前面的docker組合來運行一個容器
- ubuntu15.10:指定要運行的鏡像,docker首先從本地主機上查找鏡像是否存在,如果不存在,docker就會從鏡像倉庫docker hub下載公共鏡像
- /bin/echo “hello world”:在啓動的容器裏面執行的命令
以上命令的含義:docker以一個ubuntu15.10鏡像創建一個新容器,然後再容器裏面執行 /bin/echo “helloworld”,然後輸出結果
交互式容器
通過docker的兩個參數-i -t ,讓docker運行的容器實現對話能力
docker run -i -t ubuntu:15.10 /bin/bash
-
-t :在新容器內指定一個僞終端,或者終端
-
-i :允許你對容器內的標準輸入(STDIN)進行交互
-
cat /proc/version 查看當前系統的版本信息
運行exit命令或者ctrl+d來退出容器
後臺啓動容器
創建一個以進程方式運行的容器
docker run -d ubuntu:15.10 /bin/sh -c "while true;do echo hello world;sleep 1; done"
這個長字符串叫做容器的id,對每個容器來說都是唯一的,我們可以通過容器的id來查看對應的容器發生了什麼.
查看容器有無在運行
docker ps
- container id 容器id
- image:使用的鏡像
- command:啓動容器時運行的命令
- created:容器創建的時間
- status:容器狀態
- created(創建中)
- restarting(重啓中)
- running或者up(運行中)
- removing(遷移中)
- paused(暫停中)
- exited(停止)
- dead(死亡)
- ports:容器端口信息和使用的連接類型(tcp\udp)
- names:自動分配的容器名稱
原始主機中查看容器內的標準輸出
docker logs 52dfdf29ba58
停止容器
docker stop 52dfdf29ba58
docker容器使用
docker客戶端
查看docker客戶端的所有命令選項
docker
查看具體命令的更深用法,如stats指令的具體用法
docker stats --help
容器獲取
來取鏡像
docker pull ubuntu
啓動容器
使用一個ubuntu鏡像啓動一個容器,以參數爲命令行模式進入該容器
docker run -it ubuntu /bin/bash
- -i 交互式操作
- -t 終端
- ubuntu: ubuntu鏡像
- /bin/bash:放在鏡像名後的是命令,這裏我們希望有一個交互式的shell,因此使用的是/bin/bash
查看所有容器的命令
docker ps -a
啓動一個已停止的容器
docker start
後臺運行
大部分場景下我們是希望docker服務是在後臺運行的,我們可以使用-d指定容器的運行模式
docker run -itd --name ubuntu-test ubuntu /bin/bash
- -d 默認不會進入該容器,想要進入容器需要使用指令docker exec
停止一個容器
docker stop [容器id]
停止的容器通過docker restart重啓
docker restart [容器id]
進入容器
在使用-d參數之後,容器啓動後會進入後臺,此時想要進入容器,可以通過以下指令進入
- docker attach
- docker exec : 推薦使用docker exec命令,因爲此退出容器終端,不會導致容器的停止
attach命令
docker attach cd2c8040fba6
退出容器,會導致容器停止
exec命令
docekr exec -it cd2c8040fba6 /bin/bash
導出和導入容器
導出本地容器,使用docker export命令
docker export cd2c8040fba6 > ubuntu.tar
導入容器快照
可以使用docker import從容器快照文件中在導入爲鏡像,以下將快照文件ubuntu.tar導入到鏡像ubuntu:v1
cat ./ubuntu.tar | docker import - ubuntu:v1
也可以通過指定url或者某個目錄來導入
docker import http://example.com/exampleimage.tgz example/imagerepo
刪除容器
刪除容器使用docker rm命令
docker rm -f cd2c8040fba6
清理掉所有處於終止狀態的容器
docker container prune
web應用
運行一個web應用
將在docker容器中運行一個python flask應用來運行一個web應用
docker pull training/webapp #載入鏡像
docker run -d -P training/webapp python app.py
- -d 讓容器在後臺運行
- -P 將容器內部使用的網絡端口隨機映射到我們使用的主機上
查看web應用容器
docker ps
多了端口信息 ports
0.0.0.0:49153->5000/tcp, :::49153->5000/tcp
docker 開放了5000端口(默認python flask端口)映射到主機端口49153上
我們通過瀏覽器訪問web應用
也可以通過-p參數來設置不一樣的端口
docker run -d -p 5000:5000 training/webapp python app.py
容器內部的5000端口映射到我們本地主機的5000端口上
網絡端口的快捷方式
通過docker ps命令可以查看到容器的端口映射,docker還提供了另一個快捷方式docker port,使用docker post可以查看指定(id 或者 名字)容器的某個確定端口映射到本機的端口號.上面我們創建的容器id爲18b8aa6acac6名字爲naughty_kalam.我們可以使用
docker port 18b8aa6acac6
docker port naughty_kalam
查看web應用程序日誌
查看容器內部的標準輸出
docker logs [id或名字]
- -f:讓docker logs像使用tail -f 一樣來輸出容器內部的標準輸出,從上面可以看出來應用程序使用的是5000端口並且能夠看到應用程序的訪問日誌
查看web應用程序容器的進程
查看容器內部運行的進程
docker top naughty_kalam
檢查web應用程序
使用docker inspect 來查看docker的底層信息,它會返回一個json文件記錄着docker容器的配置和狀態信息
docker inspect naughty_kalam
停止web應用容器
docker stop friendly_perlman
重啓web應用
已經停止的web容器,使用docekr start來啓動
docker start friendly_perlman
查詢最後一次創建的容器
docker ps -l
重啓正在運行的容器
docker restart
移除web應用容器
刪除不需要的容器
docker rm friendly_perlman
刪除容器時,容器必須是停止狀態,否則會報錯
docker鏡像使用
在運行容器時,使用的鏡像如果在本地不存在,docker就會自動從docker鏡像倉庫中下載,默認是從docker hub公共鏡像源下載
列出鏡像列表
列出本地主機上的鏡像
docker images
- repository :表示鏡像倉庫源
- tag :鏡像的標籤
- image id :鏡像id
- created :鏡像創建時間
- size :鏡像大小
同一個倉庫源可以有多個tag,代表這個倉庫源的不同版本,如ubuntu倉庫源裏,有15.10 14.04等多個不同的版本,我們使用repository:tag來定義不同的鏡像.所以當我們要使用版本爲15.10的ubuntu系統鏡像阿里運行容器時
docker run -t -i ubuntu:15.10 /bin/bash
- -i :交互式操作
- -t:終端
- ubuntu:15.10 :這裏指用ubuntu15.10版本的鏡像爲基礎來啓動容器
- /bin/bash : 放在鏡像名後面的是命令.這裏我們希望有個交互式shell,因此用的是/bin/bash
如果要使用ubuntu14.04版本爲系統鏡像來運行容器時
docker run -i -t ubuntu:14.04 /bin/bash
如果不指定一個鏡像的版本標籤,例如你只是用ubuntu,docker將默認使用ubuntu:latest鏡像
獲取一個新的鏡像
在本地主機上使用一個不存在的鏡像時docker就會自動下載這個鏡像.如果我們像預先下載這個鏡像,我們就可以使用docker pull命令來下載
docker pull ubuntu:13.10
下完之後就可以直接使用這個鏡像來運行docker
查找鏡像
我們可以從docker hub網站來搜索鏡像,docker hub網站https://hub.docker.com/.我們也可以使用docker search命令搜索鏡像.比如我們需要一個httpd的鏡像來作爲我們的web服務.我們可以通過docker search命令搜索httpd來尋找適合我們的鏡像
docker search httpd
- name :鏡像倉庫源的名稱
- description:鏡像的描述
- official:是否是docker官方發佈
- stars:類似github上的star,表示點贊 喜歡
- automated:自動構建
拖取鏡像
docker pull httpd
接着就可以使用這個鏡像了
刪除鏡像
使用docker rmi命令
docker rmi a4c7cb30a6ff
刪除所有鏡像
docker rim i `docker images -q`
創建鏡像
當我們從docker鏡像倉庫中下載的鏡像不能滿足我們的需求的時候,我們就可以通過以下兩種方式對鏡像進行更改
- 從已創建的容器中更新鏡像,並提交這個鏡像
- 使用dockerfile指令來創建一個新的鏡像
更新鏡像
更新鏡像之前我們需要使用鏡像來創建一個容器
docker run -it ubuntu:15.10 /bin/bash
在運行的容器內使用apt-get update命令進行更新,在操作完成之後,輸入exit命令來退出容器,此時id爲79171d4b8787的容器,是按照我們的需求更改的容器.我們可以通過命令docker commit來提交容器副本
docker commit -m="has update" -a="wanan" 79171d4b8787 ububtu:v2
- -m :提交的描述信息
- -a :指定鏡像作者
- 79171d4b8787 :容器id
- ubuntu:v2 :指定要創建的目標鏡像名
我們可以使用docker images來查看我們的新鏡像
docker images
使用我們的新鏡像ubuntu:v2來啓動一個容器
構建鏡像
使用命令docker bulid,從零開始來創建一個新的鏡像,爲此我們需要創建一個Dockerfile文件,其中包含一組指令來告訴docker如何構建我們的鏡像
[root@mycentos ~]# cat Dockerfile
FROM centos:6.7
MAINTAINER Fisher "[email protected]"
RUN /bin/echo 'root:123456' |chpasswd
RUN useradd runoob
RUN /bin/echo 'runoob:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
每一個指令都會在鏡像上創建一個新的層,每一個指令的前綴必須都是大寫的.第一條指令FROM 指定使用那個鏡像源,RUN指令告訴docker在鏡像內執行命令,安裝了什麼,然後我們使用Dockerfile文件,通過docker build命令來創建一個鏡像
docker build -t wanan/centos:6.7 .
- -t :指定要創建的目標鏡像名
- . : Dockerfile文件所在的目錄,可以指定Dockerfile的絕對路徑
使用docker images查看創建的鏡像已經在列表中存在
我們可以使用新的鏡像來創建容器
docker run -it wanan/centos:6.7 /bin/bash
設置鏡像標籤
我們可以使用docker tag命令,爲鏡像添加一個新的標籤
docker tag 68bb92d72b8d wanan/centos:dev
可以看到id爲68bb92d72b8d多一個標籤
docker容器連接
前面我們實現了通過網絡端口來訪問運行在docker容器內的服務.容器中可以運行一些網絡應用,要讓外部也可以訪問這些應用,可以通過-P或者-p參數來指定端口映射,下面通過端口連接到一個docker容器
網絡端口映射
創建一個python應用的容器
docker run -d -P training/webapp python app.py
另外,我們可以指定容器綁定的網絡地址,比如綁定127.0.0.1.我們使用-P綁定端口號,使用docker ps可以看到容器5000綁定了主機端口49155
我們也可以使用-p標識來指定容器端口綁定到主機端口
- -P :是容器內部端口隨機映射到主機的端口
- -p :是容器內部端口綁定到指定的主機端口
docker run -d -p 5000:5000 training/webapp python app.py
可以指定容器綁定的網絡地址,比如綁定127.0.0.1
docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
這樣我們就可以通過訪問127.0.0.5001來訪問容器5000端口了.之前的都是默認綁定tcp端口,如果要綁定udp端口,可以在端口後面加上/udp
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
docker port 命令可以讓我們快捷查看端口的綁定情況
docker port loving_satoshi 5000/udp
docker容器互聯
端口映射並不是唯一把docker連接到另一個容器的方法.docker有一個連接系統允許將多個容器連接在一起,共享連接信息.docker連接會創建一個父子關係,其中父容器可以看到子容器的信息
容器命名
當我們創建容器的時候,docker會自動對他進行命名.另外我們也可以使用–name 標識來命名容器
docker run -d -P --name wanan training/webapp python app.py
新建網絡
下面創建一個新的docker網絡
docker network create -d bridge test-net
- -d :參數指定docker網絡類型,有bridge overlay
其中overlay網絡類型用於swarm mode
連接容器
運行一個容器並連接到新建的test-net網絡
docker run -itd --name test1 --network test-net ubuntu /bin/bash
打開一個新的終端,在運行一個容器並加入到test-net網絡
docker run -itd --name test2 --network test-net ubuntu /bin/bash
通過平來證明test1容器和test2容器建立了互聯關係,如果test1或者test2容器中無ping命令,則在容器內執行一下命令安裝ping(可以在一個容器內按裝好,提交到容器鏡像,在以新的鏡像重新運行以上兩個容器)
docker exec -it test1 /bin/bash
apt-get update
apt install iputils-ping
這樣test1容器就和test2容器建立了相互連接,如果有多個容器需要相互連接,推薦使用docker compose
配置dns
可以在原始主機中的/etc/docker/daemon.json文件中添加以下內容來設置全部容器的dns
{
"dns" : [
"114.114.114.114",
"8.8.8.8"
]
}
設置完之後,啓動容器的dns會自動配置爲114.114.114.114和8.8.8.8.配置完,需要重啓docker才能生效.查看容器的dns是否生效可以使用以下命令,他會輸出容器的dns信息
docker run -it --rm ubuntu cat etc/resolv.conf
手動指定容器的配置
如果只是想在指定容器設置dns,則可以使用
docker run -it --rm -h host_ubuntu --dns=114.114.114.114 --dns-search=test.com ubuntu
- –rm :容器退出時自動起立容器內部的文件系統
- -h HOSTNAME 或者 --hostname=HOSTNAME :設定容器的主機名,他會被寫入到容器內的/etc/hostname和/etc/hosts
- –dns=IP_ADDRESS:添加dns服務器到容器的/etc/resolv.conf中,讓容器用這個服務器來解析所有不在/etc/hosts中的主機名
- –dns-search=DOMAIN:設定容器的搜索域,當設定搜索域爲.example.com時,在搜索一個名爲host的主機時,dns不僅搜索host,還會搜索host.example.com
如果在容器啓動時沒有指定–nds和–dns-search,docker會默認用原始主機上的/etc/resolv.conf來配置dns
docker倉庫管理
先給我去https://hub.docker.com免費註冊一個賬號去
登錄和退出
docker login
docker logout
推送鏡像
登錄之後可以通過docker push命令將自己的鏡像推送到docker hub
docker Dockerfile
dockerfile 是一個用來構建鏡像的文本文件,文本內容包含了一條條構建鏡像所需要的指令和說明
使用dockerfile定製鏡像
定製一個nginx鏡像
構建好的鏡像內會有一個/usr/share/nginx/html/index.html文件
在一個空目錄下新建一個名爲Dockerfile文件,並在文件內添加以下內容
FROM nginx
RUN echo "這是一個本地創建的nginx鏡像" > /usr/share/nginx/html/index.
FROM和RUN指令的作用
- FROM:定製的鏡像都是基於FROM的鏡像,這裏的nginx就是定製需要的基礎鏡像,後續的操作都是基於nginx
- RUN: 用於執行後面跟着的命令行命令.有兩種格式
shell格式
RUN [命令行命令]
# [命令行命令] 等同於在終端操作的shell命令
exec格式
RUN ["可執行文件","參數1","參數2"]
#例如:
#RUN ["./test.php","dev","offline"]等價於 RUN ./test.php dev offline
注意 dockerfile的指令每一次執行都會在docker上新建一層.所以過多無意義的層會造成鏡像膨脹過大
FROM centos
RUN yum -y install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
以上執行會創建3層鏡像.可簡化爲以下格式
FROM centos
RUN yum -y install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz
如上,以&&符號連接命令,這樣執行後,只會創建一層鏡像
開始構建鏡像
在dockerfile文件的存放目錄下,執行構建動作.以下實例,通過目錄下的dcokerfile構建一個nginx:v3(鏡像名稱:鏡像標籤)
最後的.代表本次執行的上下文路徑
docker build -t nginx:v3 .
以上顯示說明已經構建成功
上下文路徑,有提到指令最後一個.是上下文路徑,那麼什麼是上下文路徑呢
docker bulid -t nginx:v3 .
上下文路徑,是指docker在構建鏡像,有時候想要使用到本機的文件(比如複製),docker build 命令得知這個路徑之後,會將路徑下的所有內容打包.
由於docker的運行模式是c/s.我們本機是c,docker引擎是s.實際的構建過程是在docker引擎下完成的,所以這個時候無法用到我們本機的文件,這就需要我們本機的指定目錄下的文件一起打包提供給docker引擎使用.如果未說明最後一個參數,那麼默認上下文路徑技術dockerfile所在的位置.
上下文路徑不要放無用的文件,因爲會一起打包發送給docker引擎,如果文件過多會造成過程緩慢.
docker compose
compose簡介
compose是用於定義和運行多容器docker應用程序的工具.通過compose,您可以使用yml文件來配置應用程序需要的所有服務,然後使用一個命令就可以從yml文件配置中創建並啓動所有服務.
使用compose的三個步驟
- 使用dockerfile定義應用程序的環境
- 使用docker-compose.yml定義構成應用程序的服務,這樣他們可以在隔離環境中一起運行.
- 最後,執行docker-compose up命令來啓動並運行整個應用程序
docker-compose.yml的配置案例如下
# yaml 配置實例
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
compose安裝
linux上我們可以從github上下載二進制包來使用
curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version
對於alpine,需要下載依賴包.py-pip,python-dev,libffi-dev,openssl-dev,gcc,libc-dev,和 make。
新建一個app.py複製進去以下內容
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
在此實例中,redis是應用程序網絡上redis容器的主機名,該主機使用的端口爲6379.創建一個requirements.txt
flask
redis
創建dockerfile文件
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run"]
-
FROM python:3.7-alpine:從python3.7映像開始構建鏡像
-
WORKDIR/code:將工作目錄設置爲/code
-
ENV FLASK_APP app.py ENV FLASK_RUN_HOST 0.0.0.0
設置flask命令使用的環境變量
-
RUN apk add --no-cache gcc musl-dev linux-headers:安裝gcc ,以便諸如MarkupSafe 和 SQLAlchemy 之類的 Python 包可以編譯加速。
-
COPY requirements.txt requirements.txt RUN pip install -r requirements
複製requirements.txt並安裝python依賴項
-
COPY .:將.項目中的當前目錄複製到.鏡像中的工作目錄
-
CMD[“flask”,“run”]:容器提供默認的執行命令爲:flask run
創建docker-compose.yml
# yaml 配置
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
該compose定義了兩個服務:web和redis
- web:該web服務使用從dockerfile當前目錄中構建的鏡像,然後,它將容器和主句綁定到暴露的端口5000.此示例服務使用Flask web服務的默認端口5000
- redis:該redis服務使用docker hub的公共redis映像
使用compose命令構建和運行應用
docker-compose up
docker安裝ubuntu
查看可用ubuntu
訪問 Ubuntu 鏡像庫地址: https://hub.docker.com/_/ubuntu?tab=tags&page=1。
可以通過 Sort by 查看其他版本的 Ubuntu。默認是最新版本 ubuntu:latest 。
拉取最新的ubuntu鏡像
docker pull ubuntu
docker pull ubuntu:latest
查看本地鏡像
docker images
運行容器,並可以通過exec命令進入ubuntu容器
docker run -itd --name ubuntu-test ubuntu
安裝centos
拉取指定版本的centos鏡像
docker pull centos:centos7
查看本地鏡像
docker images
運行容器並通過exec命令進入centos容器
docker run -itd --name centos-test centos:centos7
docker exec -it centos-test bash
docker安裝nginx
找版本
docker search nginx
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-sV9ynXGU-1665117305902)(C:/Users/14980/AppData/Roaming/Typora/typora-user-images/image-20220402230406352.png)]
拉取
docker pull nginx
查看本地鏡像
docker images
運行容器
docker run --name nginx-test -p 8080:80 -d nginx
- –name nginxe-test :容器名稱
- -p 8080:80 :端口映射,將本地8080端口映射到容器內部的80端口
- -d nginx :設置容器在後臺一直執行
docker exec -it nginx-test bash
nginx+php部署
拉取php
docker pull php:5.6-fpm
docker run --name myphp-fpm -v ~/nginx/www:/www -d php:5.6-fpm
- –name myphp-fpm:將容器命名爲myphp-fpm
- -v ~/nginx/www:/www:將主機中項目的目錄www掛載到容器的/www
創建~/nginx/conf/conf.d目錄
mkdir ~/nginx/conf/conf.d
添加 ~/nginx/conf/conf.d/runoob-test-php.conf 文件
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm index.php;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /www/$fastcgi_script_name;
include fastcgi_params;
}
}
配置文件
- php:9000:表示php-fpm服務中的url
- /www/:是myphp-php中php文件存儲路徑,映射到本地的~/nginx/www目錄
啓動nginx
docker run --name runoob-php-nginx -p 8083:80 -d \
-v ~/nginx/www:/usr/share/nginx/html:ro \
-v ~/nginx/conf/conf.d:/etc/nginx/conf.d:ro \
--link myphp-fpm:php \
nginx
- -p 8083:80:端口映射,把nginx中的80映射到本地的8083端口
- ~/nginx/www:是本地html文件的存儲目錄,/usr/share/nginx/html是容器內html文件的存儲目錄
- ~/nginx/conf/conf.d 是本地nginx配置文件的存儲目錄,/etc/nginx/conf.d是容器內nginx配置文件的存儲目錄
- –link myphp-fpm:php :是把myphp-fpm的網絡併入nginx,並通過修改nginx的/etc/hosts,把域名php映射成127.0.0.1,讓nginx通過php:9000訪問php-fpm
在~/nginx/www目錄下創建index.php
<?php
echo phpinfo();
?>
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-CYoKKM8X-1665117305903)(C:/Users/14980/AppData/Roaming/Typora/typora-user-images/image-20220403140022917.png)]
docker安裝mysql
拉鏡像
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ILhjSVpQ-1665117305903)(C:/Users/14980/AppData/Roaming/Typora/typora-user-images/image-20220403140206082.png)]
運行容器
docker run -itd --name mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-rzxpy6nV-1665117305904)(C:/Users/14980/AppData/Roaming/Typora/typora-user-images/image-20220403140450894.png)]
- -p 3307:3306 :映射容器服務的3306端口到原始主機的3307端口上,外部主機可以通過宿主機ip:3306訪問到mysql服務
- MYSQL_ROOT_PASSWORD=123456:設置mysql服務root用戶的密碼
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-WgTfOAFS-1665117305904)(C:/Users/14980/AppData/Roaming/Typora/typora-user-images/image-20220403141235682.png)]
docker安裝tomcat
創建tomact
創建tomcat,用於存放後面相關的東西
mkdir -p ~/tomcat/webapps ~/tomcat/logs ~/tomcat/conf
- webapps目錄將映射爲tomcat容器配置的應用程序目錄
- logs目錄將映射爲tomcat容器的日誌目錄
- conf目錄裏的配置文件經映射爲tomcat容器的配置文件
進入tomcat目錄,創建Dockerfile文件
FROM openjdk:8-jre
ENV CATALINA_HOME /usr/local/tomcat
ENV PATH $CATALINA_HOME/bin:$PATH
RUN mkdir -p "$CATALINA_HOME"
WORKDIR $CATALINA_HOME
# let "Tomcat Native" live somewhere isolated
ENV TOMCAT_NATIVE_LIBDIR $CATALINA_HOME/native-jni-lib
ENV LD_LIBRARY_PATH ${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}$TOMCAT_NATIVE_LIBDIR
# runtime dependencies for Tomcat Native Libraries
# Tomcat Native 1.2+ requires a newer version of OpenSSL than debian:jessie has available
# > checking OpenSSL library version >= 1.0.2...
# > configure: error: Your version of OpenSSL is not compatible with this version of tcnative
# see http://tomcat.10.x6.nabble.com/VOTE-Release-Apache-Tomcat-8-0-32-tp5046007p5046024.html (and following discussion)
# and https://github.com/docker-library/tomcat/pull/31
ENV OPENSSL_VERSION 1.1.0f-3+deb9u2
RUN set -ex; \
currentVersion="$(dpkg-query --show --showformat '${Version}\n' openssl)"; \
if dpkg --compare-versions "$currentVersion" '<<' "$OPENSSL_VERSION"; then \
if ! grep -q stretch /etc/apt/sources.list; then \
# only add stretch if we're not already building from within stretch
{ \
echo 'deb http://deb.debian.org/debian stretch main'; \
echo 'deb http://security.debian.org stretch/updates main'; \
echo 'deb http://deb.debian.org/debian stretch-updates main'; \
} > /etc/apt/sources.list.d/stretch.list; \
{ \
# add a negative "Pin-Priority" so that we never ever get packages from stretch unless we explicitly request them
echo 'Package: *'; \
echo 'Pin: release n=stretch*'; \
echo 'Pin-Priority: -10'; \
echo; \
# ... except OpenSSL, which is the reason we're here
echo 'Package: openssl libssl*'; \
echo "Pin: version $OPENSSL_VERSION"; \
echo 'Pin-Priority: 990'; \
} > /etc/apt/preferences.d/stretch-openssl; \
fi; \
apt-get update; \
apt-get install -y --no-install-recommends openssl="$OPENSSL_VERSION"; \
rm -rf /var/lib/apt/lists/*; \
fi
RUN apt-get update && apt-get install -y --no-install-recommends \
libapr1 \
&& rm -rf /var/lib/apt/lists/*
# see https://www.apache.org/dist/tomcat/tomcat-$TOMCAT_MAJOR/KEYS
# see also "update.sh" (https://github.com/docker-library/tomcat/blob/master/update.sh)
ENV GPG_KEYS 05AB33110949707C93A279E3D3EFE6B686867BA6 07E48665A34DCAFAE522E5E6266191C37C037D42 47309207D818FFD8DCD3F83F1931D684307A10A5 541FBE7D8F78B25E055DDEE13C370389288584E7 61B832AC2F1C5A90F0F9B00A1C506407564C17A3 713DA88BE50911535FE716F5208B0AB1D63011C7 79F7026C690BAA50B92CD8B66A3AD3F4F22C4FED 9BA44C2621385CB966EBA586F72C284D731FABEE A27677289986DB50844682F8ACB77FC2E86E29AC A9C5DF4D22E99998D9875A5110C01C5A2F6059E7 DCFD35E0BF8CA7344752DE8B6FB21E8933C60243 F3A04C595DB5B6A5F1ECA43E3B7BBB100D811BBE F7DA48BB64BCB84ECBA7EE6935CD23C10D498E23
ENV TOMCAT_MAJOR 8
ENV TOMCAT_VERSION 8.5.32
ENV TOMCAT_SHA512 fc010f4643cb9996cad3812594190564d0a30be717f659110211414faf8063c61fad1f18134154084ad3ddfbbbdb352fa6686a28fbb6402d3207d4e0a88fa9ce
ENV TOMCAT_TGZ_URLS \
# https://issues.apache.org/jira/browse/INFRA-8753?focusedCommentId=14735394#comment-14735394
https://www.apache.org/dyn/closer.cgi?action=download&filename=tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz \
# if the version is outdated, we might have to pull from the dist/archive :/
https://www-us.apache.org/dist/tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz \
https://www.apache.org/dist/tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz \
https://archive.apache.org/dist/tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz
ENV TOMCAT_ASC_URLS \
https://www.apache.org/dyn/closer.cgi?action=download&filename=tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz.asc \
# not all the mirrors actually carry the .asc files :'(
https://www-us.apache.org/dist/tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz.asc \
https://www.apache.org/dist/tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz.asc \
https://archive.apache.org/dist/tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz.asc
RUN set -eux; \
\
savedAptMark="$(apt-mark showmanual)"; \
apt-get update; \
\
apt-get install -y --no-install-recommends gnupg dirmngr; \
\
export GNUPGHOME="$(mktemp -d)"; \
for key in $GPG_KEYS; do \
gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \
done; \
\
apt-get install -y --no-install-recommends wget ca-certificates; \
\
success=; \
for url in $TOMCAT_TGZ_URLS; do \
if wget -O tomcat.tar.gz "$url"; then \
success=1; \
break; \
fi; \
done; \
[ -n "$success" ]; \
\
echo "$TOMCAT_SHA512 *tomcat.tar.gz" | sha512sum -c -; \
\
success=; \
for url in $TOMCAT_ASC_URLS; do \
if wget -O tomcat.tar.gz.asc "$url"; then \
success=1; \
break; \
fi; \
done; \
[ -n "$success" ]; \
\
gpg --batch --verify tomcat.tar.gz.asc tomcat.tar.gz; \
tar -xvf tomcat.tar.gz --strip-components=1; \
rm bin/*.bat; \
rm tomcat.tar.gz*; \
rm -rf "$GNUPGHOME"; \
\
nativeBuildDir="$(mktemp -d)"; \
tar -xvf bin/tomcat-native.tar.gz -C "$nativeBuildDir" --strip-components=1; \
apt-get install -y --no-install-recommends \
dpkg-dev \
gcc \
libapr1-dev \
libssl-dev \
make \
"openjdk-${JAVA_VERSION%%[.~bu-]*}-jdk=$JAVA_DEBIAN_VERSION" \
; \
( \
export CATALINA_HOME="$PWD"; \
cd "$nativeBuildDir/native"; \
gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)"; \
./configure \
--build="$gnuArch" \
--libdir="$TOMCAT_NATIVE_LIBDIR" \
--prefix="$CATALINA_HOME" \
--with-apr="$(which apr-1-config)" \
--with-java-home="$(docker-java-home)" \
--with-ssl=yes; \
make -j "$(nproc)"; \
make install; \
); \
rm -rf "$nativeBuildDir"; \
rm bin/tomcat-native.tar.gz; \
\
# reset apt-mark's "manual" list so that "purge --auto-remove" will remove all build dependencies
apt-mark auto '.*' > /dev/null; \
[ -z "$savedAptMark" ] || apt-mark manual $savedAptMark; \
apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \
rm -rf /var/lib/apt/lists/*; \
\
# sh removes env vars it doesn't support (ones with periods)
# https://github.com/docker-library/tomcat/issues/77
find ./bin/ -name '*.sh' -exec sed -ri 's|^#!/bin/sh$|#!/usr/bin/env bash|' '{}' +
# verify Tomcat Native is working properly
RUN set -e \
&& nativeLines="$(catalina.sh configtest 2>&1)" \
&& nativeLines="$(echo "$nativeLines" | grep 'Apache Tomcat Native')" \
&& nativeLines="$(echo "$nativeLines" | sort -u)" \
&& if ! echo "$nativeLines" | grep 'INFO: Loaded APR based Apache Tomcat Native library' >&2; then \
echo >&2 "$nativeLines"; \
exit 1; \
fi
EXPOSE 8080
CMD ["catalina.sh", "run"]
通過Dockerfile文件創建一個鏡像,換成自己的名字
docker build -t tomcat .
使用tomcat鏡像
docker run --name tomcat -p 8080:8080 -v $PWD/test:/usr/local/tomcat/webapps/test -d tomcat
- -p 8080:8080:將主機的8080端口映射到容器的8080端口
- -v $PWD/test:/usr/local/tomcat/webapps/test :將主機中當前目錄下的test掛載到容器的/test
docker 部署 xxl-job、引用外部配置文件、連接宿主機 Mysql_docker部署xxljob後管理頁面進不去-CSDN博客
1. 拉取 xxl- job 源碼
git clone https://gitee.com/xuxueli0323/xxl-job.git
2. 使用IDEA打開,打包
3. 複製 jar 包、配置文件、Dockerfile 到 xxl-job 目錄下
4. 修改 Dockerfile
-
FROM openjdk:8-jre-slim
-
MAINTAINER xuxueli
-
-
ENV PARAMS=""
-
-
# 設置外部配置文件路徑(必須,否則無法加載到此配置文件)
-
ENV JAVA_OPTS="-Dspring.config.location=/xxl-job/application.properties"
-
-
# 複製配置文件到容器中
-
COPY ./application.properties /xxl-job/application.properties
-
COPY ./logback.xml /xxl-job/logback.xml
-
-
ENV TZ=PRC
-
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
-
-
ADD xxl-job-admin-*.jar /xxl-job/app.jar
-
-
ENTRYPOINT ["sh","-c","java -jar $JAVA_OPTS /xxl-job/app.jar $PARAMS"]
5. 配置連接宿主機數據庫
5.1 先找到宿主機IP
主要修改數據庫連接信息。宿主機在與容器同一局域網,所以需要先找到宿主機此局域網的 ip。ifconfig 命令找到 docker0 網卡信息,IP爲 172.18.0.1
5.2 修改 application.properties 中的數據庫連接信息
-
### web
-
server.port=8080
-
server.servlet.context-path=/xxl-job-admin
-
-
### actuator
-
management.server.servlet.context-path=/actuator
-
management.health.mail.enabled=false
-
-
### resources
-
spring.mvc.servlet.load-on-startup=0
-
spring.mvc.static-path-pattern=/static/**
-
spring.resources.static-locations=classpath:/static/
-
-
### freemarker
-
spring.freemarker.templateLoaderPath=classpath:/templates/
-
spring.freemarker.suffix=.ftl
-
spring.freemarker.charset=UTF-8
-
spring.freemarker.request-context-attribute=request
-
spring.freemarker.settings.number_format=0.##########
-
-
### mybatis
-
mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml
-
#mybatis.type-aliases-package=com.xxl.job.admin.core.model
-
-
### xxl-job, datasource
-
spring.datasource.url=jdbc:mysql://172.18.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
-
spring.datasource.username=root
-
spring.datasource.password=123456
-
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
-
-
### datasource-pool
-
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
-
spring.datasource.hikari.minimum-idle=10
-
spring.datasource.hikari.maximum-pool-size=30
-
spring.datasource.hikari.auto-commit=true
-
spring.datasource.hikari.idle-timeout=30000
-
spring.datasource.hikari.pool-name=HikariCP
-
spring.datasource.hikari.max-lifetime=900000
-
spring.datasource.hikari.connection-timeout=10000
-
spring.datasource.hikari.connection-test-query=SELECT 1
-
spring.datasource.hikari.validation-timeout=1000
-
-
### xxl-job, email
-
spring.mail.host=smtp.qq.com
-
spring.mail.port=25
-
spring.mail.username=184248697@qq.com
-
spring.mail.from=184248697@qq.com
-
spring.mail.password=roxdezsngxuvbjii
-
spring.mail.properties.mail.smtp.auth=true
-
spring.mail.properties.mail.smtp.starttls.enable=true
-
spring.mail.properties.mail.smtp.starttls.required=true
-
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
-
-
### xxl-job, access token
-
xxl.job.accessToken=default_token
-
-
### xxl-job, i18n (default is zh_CN, and you can choose "zh_CN", "zh_TC" and "en")
-
xxl.job.i18n=zh_CN
-
-
## xxl-job, triggerpool max size
-
xxl.job.triggerpool.fast.max=200
-
xxl.job.triggerpool.slow.max=100
-
-
### xxl-job, log retention days
-
xxl.job.logretentiondays=30
6. 構建鏡像
docker build -t xxl-job-admin .
7. 運行容器
docker run -d -p 8181:8080 xxl-job-admin
8. 訪問
docker結束ps的命令 docker pause stop_mob64ca14079fb3的技術博客_51CTO博客
Docker 容器
- 容器鏡像是輕量的、可執行的獨立軟件包 ,包含軟件運行所需的所有內容:代碼、運行時環境、系統工具、系統庫和設置。
- 容器化軟件適用於基於Linux和Windows的應用,在任何環境中都能夠始終如一地運行。
- 容器賦予了軟件獨立性,使其免受外在環境差異(例如,開發和預演環境的差異)的影響,從而有助於減少團隊間在相同基礎設施上運行不同軟件時的衝突。
Docker 容器的基本操作命令(介紹常用的)
docker ps : 列出所有的容器
- -a :顯示所有的容器,包括未運行的。
- -f :根據條件過濾顯示的內容。
- --format :指定返回值的模板文件。
- -l :顯示最近創建的容器。
- -n :列出最近創建的n個容器。
- --no-trunc :不截斷輸出。
- -q :靜默模式,只顯示容器編號。
- -s :顯示總的文件大小。
demo:
CONTAINER ID 容器id,IMAGE 鏡像名,COMMAND指令,CREATED 創建時間,STATUS(UP代表運行中Exited退出)
PORTS 端口,NAMES 該容器的名稱
docker run: 創建一個新的容器並運行一個命令
- -a stdin: 指定標準輸入輸出內容類型,可選 STDIN/STDOUT/STDERR 三項;
- -d: 後臺運行容器,並返回容器ID;
- -i: 以交互模式運行容器,通常與 -t 同時使用;
- -p: 端口映射,格式爲:主機(宿主)端口:容器端口
- -t: 爲容器重新分配一個僞輸入終端,通常與 -i 同時使用;
- --name="nginx-lb": 爲容器指定一個名稱;
- --dns 8.8.8.8: 指定容器使用的DNS服務器,默認和宿主一致;
- --dns-search example.com: 指定容器DNS搜索域名,默認和宿主一致;
- -h "mars": 指定容器的hostname;
- -e username="ritchie": 設置環境變量;
- --env-file=[]: 從指定文件讀入環境變量;
- --cpuset="0-2" or --cpuset="0,1,2": 綁定容器到指定CPU運行;
- -m :設置容器使用內存最大值
- --net="bridge": 指定容器的網絡連接類型,支持 bridge/host/none/container: 四種類型;
- --link=[]: 添加鏈接到另一個容器;
- --expose=[]: 開放一個端口或一組端口;
demo:
1. 將tomcat 8080映射到宿主機的8080端口
2.使用-ti進入tomcat服務器
docker start/stop/restart
- docker start 容器id或容器name
- docker stop 容器id或容器name
- docker restart 容器id或容器name
docker 進入容器之後退出
- exit :退出並停止容器
- ctrl +p + q: 退出不停止容器
docker kill 強制停止容器
- docker kill 容器id或容器name
docker 刪除容器
- docker rm 容器id
- docker rm -f ${docker ps -a -q} 批量刪除
- docker ps -a -q | xargs docker rm 批量刪除(以不定參的形式)
docker logs : 獲取容器的日誌
- -f : 跟蹤日誌輸出
- --since :顯示某個開始時間的所有日誌
- -t : 顯示時間戳
- --tail :僅列出最新N條容器日誌
demo:
mytomcat容器的2019-01-01的最新10條以時間戳顯示
Docker top :查看容器中運行的進程信息,支持 ps 命令參數
容器運行時不一定有/bin/bash終端來交互執行top命令,而且容器還不一定有top命令,可以使用docker top來實現查看container中正在運行的進程。
查看所有運行容器的進程信息
docker inspect : 獲取容器/鏡像的元數據
- -f :指定返回值的模板文件。
- -s :顯示總的文件大小。
- --type :爲指定類型返回JSON。
這個元信息有點多,我從官網找了幾個demo,mytomcat 可以換成容器name或id
1. 獲取當前容器的ip
2. 獲取該實例的日誌
3. 獲取當前實例的端口
4. 將其格式轉換成沒有空格的json
docker pause/unpause
- docker pause :暫停容器中所有的進程。
- docker unpause :恢復容器中所有的進程。
docker cp :用於容器與主機之間的數據拷貝。
demo:
參考:
Docker概念: http://dockone.io/article/6051
官方docker inspect 詳解: https://docs.docker.com/engine/reference/commandline/inspect/#parent-command