docker
容器化部署應用能夠簡化應用的部署流程,假設部署一個應用須要在機器上安裝和配置nginx
、tomcat
,若是須要新增一臺服務器,或者切換服務器,那麼就要重複一樣的操做,安裝nginx
、tomcat
並配置。容器化部署就是一次配置處處使用,將安裝nginx
配置nginx
這一系列工做製做成一個鏡像,在服務器上經過docker
拉取鏡像並啓動容器便可,以此實現集羣自動伸縮。java
docker
入門簡單,用好難,特別是製做鏡像。隨便作一個鏡像就是1g
大小,這該怎麼用。若是每次部署都要拉1g
的鏡像,想一想均可怕。若是在Dockerfile
中使用yum
安裝一些軟件,build
的時間會很長,加上鏡像太大,傳輸也耗時。應儘可能使用安裝包安裝替換yum
安裝,以及使用盡可能小的基礎鏡像。mysql
使用Dockerfile
構建鏡像,咱們能夠理解爲,docker
基於Dockerfiler
中的FROM
基礎鏡像,啓動了一個容器,而後在容器中執行Dockerfile
中定義的腳本,執行完成後再打包成鏡像。linux
docker
的鏡像是分層的,你能夠先定製一個基礎鏡像,再經過基礎鏡像去實現差別化定製。好比部署一個java
項目,每臺機制都須要jdk
,但並非每臺機器都須要安裝nginx
,那麼就能夠先製做一個jdk
基礎鏡像。固然,製做jdk
基礎鏡像也是基於更底層的基礎鏡像,好比centos
。而後再基於jdk
基礎鏡像製做nginx
鏡像,再製做應用鏡像。製做應用鏡像若是須要用到nginx
就能夠基於nginx
鏡像,不須要依賴nginx
就能夠直接基於jdk
鏡像。nginx
docker
的命令不須要記,動動手去試一試就記住了,記不住可使用docker -help
查看命令。新版本docker
將命令規範了,如docker image
是鏡像相關的,docker container
是容器相關的,一樣,也可使用docker container -help
來查看命令幫助。redis
學習doker
除了鏡像製做以外,還須要理解這三點:端口映射、網絡模式、容器卷(volume
)。sql
將宿主機端口映射到容器的端口,外部經過訪問宿主機端口從而訪問容器內應用。如容器中redis使用的端口是6379
,能夠將宿主機的10880
端口與容器的6379
端口映射,外部經過宿主機ip
和10880
端口訪問容器中的redis
。docker
### 使用鏡像運行容器
### -p 10880:6379 將宿主機10880端口映射到容器6379端口
[root@wujiuye01 redis-app]# docker container run -itd --name simple-redis \
-p 10880:6379 wujiuye/simple-redis:5.0.7
05676da445839b1f4a1995148b4656d029721503a16d67edad37956fe7ea9f3a
### 宿主機訪問容器中的redis
[root@wujiuye01 redis-app]# /root/redis/redis-5.0.5/src/redis-cli -p 10880
127.0.0.1:10880>
複製代碼
docker
支持5
種網絡模式,這裏不作詳細分析,由於我不是很瞭解。在啓動容器時,能夠指定使用哪一種網絡模式:docker container run --network [網絡模式]
。shell
bridge
: 默認使用,docket
啓動後默認建立一個docker0
網橋,默認建立的容器也是添加到這個網橋中。host
: 容器不會得到一個獨立的network namespace
,而是與宿主機共用一個。volume
)應用部署在一臺服務器上運行會產生日記,不能隨着容器的刪除而致使日記被刪除,因此須要將容器中的工做目錄與宿主機的目錄映射。或者說mysql
容器,容器移除而數據庫文件不能刪除。docker
爲咱們提供了三種不一樣的方式將目錄從宿主機掛載到容器中:volume
、bind mount
、tmpfs
。數據庫
docker
管理宿主文件系統的一部分(/var/lib/docker/volumes/容器id
)centos
docker volume create test-vol
docker volume inspect test-vol
docker container run -itd --name test --mount src=test-vol,dst=/data/apps/test wujiuye/test:1.0.0
--mount src=test-vol,dst=/data/apps/test
: 將容器卷掛載到容器的/data/apps/test
目錄。
將文件放到容器的/data/apps/test
目錄下,能夠在宿主機的/var/lib/docker/volumes/test-vol
目錄看到,反過來也是同樣的。若是不指定--mount
,默認也是使用volumes
,而且容器卷的名稱就是容器id
,也是在/var/lib/docker/volume/
目錄下。
### 建立容器卷
[root@wujiuye01 docker]# docker volume create test-vol
test-vol
### 查看容器卷信息
[root@wujiuye01 docker]# docker volume inspect test-vol
[
{
"CreatedAt": "2020-01-04T17:57:08+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/test-vol/_data",
"Name": "test-vol",
"Options": {},
"Scope": "local"
}
]
### 將容器卷掛載到容器
[root@wujiuye01 docker]# docker container run -itd --name test \
--mount src=test-vol,dst=/data/apps/test wujiuye/test:1.0.0
複製代碼
能夠存儲在宿主機系統的任意目錄,宿主機的目錄必須存在。若是宿主機新增磁盤是掛載在/data
目錄的,建議使用這種。如使用aws
的ec2
實例。
docker container run -itd --name test --mount type=bind,src=宿主機目錄,dst=容器目錄 wujiuye/test:1.0.0
複製代碼
將指定的宿主機目錄掛載到容器的指定目錄。將文件放到<容器指定目錄>
下,能夠在<宿主機指定目錄>
看到,反過來也是同樣的。
掛載存儲在宿主機系統的內存中,不會寫入宿主機的文件系統
# 較舊的 Docker 版本稱爲 docker 或 docker-engine 。若是已安裝這些程序,請卸載它們以及相關的依賴項。
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 安裝所需的軟件包。yum-utils 提供了 yum-config-manager ,而且 device mapper 存儲驅動程序須要 device-mapper-persistent-data 和 lvm2
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
# 設置穩定的倉庫。
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 安裝最新版本的 Docker Engine-Community 和 containerd
sudo yum install docker-ce docker-ce-cli containerd.io
複製代碼
## 中止
sudo systemctl stop docker
## 啓動
sudo systemctl start docker
複製代碼
準備redis
安裝包和配置文件,新建一個Dockerfile
文件,目錄結構以下:
-rw-r--r-- 1 root root 583 Jan 4 18:56 Dockerfile
-rw-r--r-- 1 root root 1984203 Jan 4 18:52 redis-5.0.7.tar.gz
-rw-r--r-- 1 root root 61797 Jan 4 18:52 redis.conf
複製代碼
編寫Dockerfile
文件,基於centos:7
鏡像
FROM centos:7
MAINTAINER wujiuye <postmaster@wujiuye.com>
# 使用ps 命令 : ps -ef|grep redis
RUN yum install -y procps
# redis安裝包和配置文件
ADD redis-5.0.7.tar.gz /usr/local/redis/
COPY redis.conf /usr/local/redis/local-redis.conf
# 安裝gcc
RUN yum install gcc -y
# 安裝make
RUN yum install make -y
# 編譯redis
RUN cd /usr/local/redis/redis-5.0.7 && \
make
RUN yum clean all
EXPOSE 6379
# 啓動redis
ENTRYPOINT /usr/local/redis/redis-5.0.7/src/redis-server
CMD ["/usr/local/redis/local-redis.conf"]
複製代碼
COPY
、ADD
命令的src
只能使用相對路徑,須要將文件拷貝到Dockerfile
的同級目錄下redis
安裝包與redis
配置文件COPY
或ADD
到容器的掛載目錄下,不然因宿主機的源目錄下沒有這些文件,容器啓動起來就找不到這些文件。構建鏡像時將文件放在容器的/data/apps/
目錄下,而啓動容器時配置宿主機目錄掛載到容器的/data/apps/
,docker
會將鏡像中原有的/data/apps/
目錄移除,才能夠掛載。RUM
運行多條命令可以使用&&
符號鏈接,也能夠寫多個RUN
### 目錄下的文件
[root@wujiuye01 redis-app]# ls
Dockerfile redis-5.0.7.tar.gz redis.conf
### 構建鏡像
[root@wujiuye01 redis-app]# docker image build --tag wujiuye/simple-redis:5.0.7 .
....
Successfully built 2aab79854763
Successfully tagged wujiuye/simple-redis:5.0.7
複製代碼
--tag
打標籤,最後的.
是Dockerfile
文件所在的位置。
docker container run \
--rm -itd \
--ulimit nofile=102400:102400 \
--name=simple-redis \
-p 10880:6379 \ # 可寫多個
--mount type=bind,src=/data/redis-app/,dst=/usr/local/redis \
wujiuye/simple-redis:5.0.7
複製代碼
--rm
: 若是容器存在則刪除,只是移除容器,正在運行的容器不會中止--name=simple-redis
: 給容器取一個名字-itd
: -i
、-t
、-d
的結合--ulimit nofile=102400:102400
設置ulimit
-p 10880:6379
宿主機與容器的端口映射--mount type=bind,src=...,dst=...
文件系統爲mount bind
,src
爲宿主機的目錄,dst
爲容器的目錄[root@wujiuye01 redis-app]# docker container ls
### 容器id 使用的鏡像 容器執行的命令 建立時間 容器狀態 端口信息 容器名稱
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
05676da44583 wujiuye/simple-redis:5.0.7 "/bin/sh -c /usr/loc…" 6 minutes ago Up 6 minutes 0.0.0.0:10880->6379/tcp simple-redis
複製代碼
在測試完鏡像可用以後,能夠選擇push到遠程倉庫,也可本身搭建一個鏡像倉庫。
hub.docker.com
帳號,id
不要隨便填寫,如:wujiuye
wujiuye/simple-redis
docker tag local/test-redis:1.0.5 wujiuye/simple-redis:5.0.7
。本地鏡像與遠程倉庫鏡像標籤不一樣時使用。docker login
輸入用戶名密碼登錄docker push wujiuye/simple-redis:5.0.7
推送鏡像至遠程倉庫[root@wujiuye01 redis-app]# docker push wujiuye/simple-redis:5.0.7
The push refers to repository [docker.io/wujiuye/simple-redis]
dafbadcc43aa: Pushing [==> ] 1.281MB/23.62MB
879a0e8874ba: Pushing [=============================> ] 66.96MB/111.8MB
ccc522a455bc: Pushing [> ] 549.9kB/100.2MB
879a0e8874ba: Pushing [================================> ] 73.04MB/111.8MB
ccc522a455bc: Pushing [> ] 1.107MB/100.2MB
ff7b8add839d: Pushing [=================> ] 51.75MB/146.8MB
dca066a10cae: Pushing [> ] 557.1kB/100.8MB
77b174a6a187: Waiting
複製代碼
容器中止
1)、docker kill [容器名]
可選參數:
--signal: 發送信號量
2)、docker stop []
複製代碼
刪除容器和鏡像
docker rmi $(docker images -q)
1)、先中止全部容器:docker stop $(docker ps -a -q)
2)、刪除全部容器:docker rm $(docker ps -a -q)
複製代碼
移除某個鏡像:
1)、docker image rm [repository,如:wujiuye/simple-redis:5.0.7]
2)、docker image rm [鏡像id]
複製代碼
移除某個容器:
docker container rm [容器名稱 或 容器id]
複製代碼