開發也需瞭解的運維知識之Docker

docker容器化部署應用能夠簡化應用的部署流程,假設部署一個應用須要在機器上安裝和配置nginxtomcat,若是須要新增一臺服務器,或者切換服務器,那麼就要重複一樣的操做,安裝nginxtomcat並配置。容器化部署就是一次配置處處使用,將安裝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端口映射,外部經過宿主機ip10880端口訪問容器中的redisdocker

### 使用鏡像運行容器
### -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爲咱們提供了三種不一樣的方式將目錄從宿主機掛載到容器中:volumebind mounttmpfs數據庫

volumes

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
複製代碼

bind mounts

能夠存儲在宿主機系統的任意目錄,宿主機的目錄必須存在。若是宿主機新增磁盤是掛載在/data目錄的,建議使用這種。如使用awsec2實例。

docker container run -itd --name test --mount type=bind,src=宿主機目錄,dst=容器目錄 wujiuye/test:1.0.0
複製代碼

將指定的宿主機目錄掛載到容器的指定目錄。將文件放到<容器指定目錄>下,能夠在<宿主機指定目錄>看到,反過來也是同樣的。

tmpfs

掛載存儲在宿主機系統的內存中,不會寫入宿主機的文件系統

docker安裝

# 較舊的 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
複製代碼

docker服務啓動與中止

## 中止
sudo systemctl stop docker
## 啓動
sudo systemctl start docker
複製代碼

製做一個簡單的redis鏡像

準備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"]
複製代碼
  • 一、COPYADD命令的src只能使用相對路徑,須要將文件拷貝到Dockerfile的同級目錄下
  • 二、不要將redis安裝包與redis配置文件COPYADD到容器的掛載目錄下,不然因宿主機的源目錄下沒有這些文件,容器啓動起來就找不到這些文件。構建鏡像時將文件放在容器的/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 bindsrc爲宿主機的目錄,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到docker hub

在測試完鏡像可用以後,能夠選擇push到遠程倉庫,也可本身搭建一個鏡像倉庫。

  • 1)、註冊hub.docker.com帳號,id不要隨便填寫,如:wujiuye
  • 2)、建立一個倉庫,如:wujiuye/simple-redis
  • 3)、若是須要,將本地的鏡像打標籤,對應到遠程倉庫,如:docker tag local/test-redis:1.0.5 wujiuye/simple-redis:5.0.7。本地鏡像與遠程倉庫鏡像標籤不一樣時使用。
  • 4)、docker login 輸入用戶名密碼登錄
  • 5)、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 
複製代碼

Other

容器中止

1)、docker kill [容器名]
可選參數:
--signal: 發送信號量

2)、docker stop []
複製代碼

刪除容器和鏡像

  • 1)、刪除全部鏡像:docker rmi $(docker images -q)
  • 2)、刪除全部容器:
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]
複製代碼
相關文章
相關標籤/搜索