DOCKER安裝及基本使用

1 DOCKER 基本結構

DOCKER安裝及基本使用

Docker客戶端:Docker是C/S的應用架構模型,一般客戶端和服務端都在同一個二進制文件中。所以通常我們都可以通過Docker命令來運行相關操作。

但是也可以通過用於程序基於API來操作。

Docker daemon:Docker 的服務端,通常表示的包都是Docker Engine,接受用戶請求,並進行相關操作。

容器:相當於虛擬機的概念,但是簡化成一個相互隔離的操作系統,無需我們關係具體細節,我們像集裝箱一樣打包就用即可。

鏡像:容器的基礎,通過Unionfs文件系統特性,實現不同鏡像堆疊。是啓動容器的一個基礎。用Dockerfile可以方便定製。

Registry:存放鏡像的地方,通過Registry我們就可以實現容器鏡像的打包帶走。

2 DOCKER 常用命令
2.1 Docker 鏡像管理
一、顯示本地鏡像:

[root@test mnt]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

upstram_nginx latest f3c5dcc79825 9 days ago 669 MB

lnmp/nginx 0.2 9fe8cdcb3e43 9 days ago 669 MB

lnmp/mysql 1.0 2c612a810853 10 days ago 374 MB

lnmp/php 1.0 fc59ef00ea8a 10 days ago 1.23 GB

二、鏡像查找:

[root@test mnt]# docker search nginx

NAME DESCRIPTION STARS OFFICIAL AUTOMATED

nginx Official build of Nginx. 5508 [OK]

jwilder/nginx-proxy Automated Nginx reverse... 961 [OK]

richarvey/nginx-php-fpm Container running Nginx 354 [OK]

million12/nginx-php Nginx + PHP-FPM 5.5, 5.6,. 76 [OK]

三、鏡像刪除:

docker rmi image id (當容器存在的時候刪不掉,應該先刪除鏡像再刪除容器)

四、鏡像拉取和推送

Docker pull 即可

五、查看鏡像的具體信息:

[root@test mnt]# docker inspect f3c5dcc79825 ##可以看到相關具體配置,和鏡像分層。

2.2 Docker 容器管理
一、創建容器:

docker create nginx(鏡像名)

二、查看運行容器:

[root@node3 ~]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

三、查看所有容器:

docker ps -a (顯示所有的容器,包括未運行的)

四、啓動容器

docker start nginx(容器名/id) 啓動容器

五、運行容器:

[root@test mnt]# docker run -d --name web(容器別名) nginx(鏡像名)

六、刪除容器:

[root@test mnt]# docker rm -f web(容器名/id) -f 強制刪除

七、進入容器:

[root@test mnt]# docker exec -it nginx(容器名/id) /bin/bash

2.3 Docker Volume
Docker Volume(卷)的概念,簡單來說,Volume就是目錄或者文件,它可以繞過容器系統,而以正常的文件或者目錄的形式存在於宿主機上。適用於容器外持久化存儲文件,或共享文件。掛載文件/目錄到容器:

docker run -itd -v /opt/webapps(本地文件或目錄):/opt/apache-tomcat-7.0.55/webapps(容器內文件或目錄) -p 80:8080 --name tomcat icfw/tomcat:1.0

注:默認文件可讀可寫,指定掛載權限可自行參考docker手冊。

3 DOCKER 快速安裝
3.1 軟件版本
操作系統:Centos 7.0

3.2 開始安裝
http://www.daocloud.io/

由於國內的源比較卡,所以我們推薦使用daocloud的方式,調用遠程腳本,安裝即可:

[root@test ~]# curl -sSL https://get.daocloud.io/docker | sh

#爲了快速拉取鏡像,還要daocloud.因爲在國內通常拉取Docker hub的鏡像都是被牆的。

[root@test ~]# curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://681a96df.m.daocloud.io

docker version >= 1.12

{"registry-mirrors": ["http://681a96df.m.daocloud.io"],

"live-restore": true

}

Success.

You need to restart docker to take effect: sudo systemctl restart docker

##實際上是相關配置寫入/etc/docker/daemon.json:指定去這個倉庫下,因爲默認是去官方的Docker hub下載鏡像的。

[root@test ~]# cat /etc/docker/daemon.json

{"registry-mirrors": ["http://681a96df.m.daocloud.io"],

"live-restore": true

}

##編輯配置文件(/usr/lib/systemd/system/docker.service),允許使用docker 客戶端遠程連接。

ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375

然後重啓docker:

systemctl restart docker

##查看docker狀態,docker 讀取的是哪個配置文件:

[root@test ~]# systemctl status docker

docker.service - Docker Application Container Engine

Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)

Active: active (running) since Sat 2017-03-11 16:43:51 CST; 1min 11s ago

 Docs: https://docs.docker.com

###這裏我們知道centos讀取的是/usr/lib/systemd/system/docker.service這個文件

三、測試docker是否啓動正常:

[root@master ~]# docker -H 127.0.0.1:2375 images

4 DOCKER 鏡像製作
4.1 DOCKER FILE 指令
DOCKER提倡使用Dockfile的方式來構建鏡像,Dockerfile是Docker的解釋型語言,通過提交Dockerfile來實現對鏡像的構建。

Dockerfile忽略大小寫,註釋用#開頭,

FROM指令:

FROM centos:centos7

##表示基礎鏡像來自哪裏,本地鏡像沒有就從倉庫獲取,指令必須放在最前面第一條。

MAINTAINER(用來指定鏡像創建者信息)

MAINTAINER admin [email protected]

##鏡像構建作者的相關信息

RUN(執行相關的系統命令)

格式:RUN <command> 或者 RUN ["executable","param1","param2"]

RUN yum install supervisor –y

CMD(系統啓動時候執行指令,但是會被第一條啓動所覆蓋)

CMD ["executable","param1","param2"] 使用 exec 執行,推薦方式;

CMD command param1 param2 在 /bin/sh 中執行,提供給需要交互的應用;

CMD ["param1","param2"] 提供給ENTRYPOINT的默認參數;

##CMD指定容器啓動是執行的命令,每個Dockerfile只能有一條CMD命令,如果指定了多條,只有最後一條會被執行。如果你在啓動容器的時候也指定的命令,那麼會覆蓋Dockerfile構建的鏡像裏面的CMD命令。

ENTRYPOINT(也是系統啓動執行命令)

格式:

ENTRYPOINT ["executable", "param1","param2"]

ENTRYPOINT command param1 param2(shell中執行)。

##和CMD一樣也是最後一條命令執行,但是和CMD不同的是,CMD命令會被docker run 中執行的命令所覆蓋,當然兩者可以結合:

ENTRYPOINT ["python", "/test.py"]

CMD ["sleep", "10"]

##在啓動的時候等於就執行了,python /test.py sleep 10

##注意

當獨自使用時,如果你還使用了CMD命令且CMD是一個完整的可執行的命令,那麼CMD指令和ENTRYPOINT會互相覆蓋只有最後一個CMD或者ENTRYPOINT有效。

EXPOSE(指定容器需要映射到宿主機器的端口)

EXPOSE <port> [<port>...]

##在編寫Docker的時候暴露容器的端口,但是只是在內部暴露,外部想映射還需要-p選項

VOLUME(指定掛載點))

VOLUME ["<mountpoint>"]

##是文件可以持久化存在,或者在容器之間共享數據。

ENV(用於設置環境變量)

ENV <key> <value>

##構建鏡像和容器啓動時候都可以使用

ADD與COPY

ADD <src> <dest>

##兩個都是複製本機文件到鏡像裏,區別是ADD如果文件是可識別的壓縮格式,則docker會幫忙解壓縮.

WORKDIR

WORKDIR /path/to/workdir

##切換當前工作目錄,寫建議寫絕對路徑,寫相對路徑會疊加。

11、ONBUILD(在子鏡像中執行)

ONBUILD <Dockerfile關鍵字>

##ONBUILD 指定的命令在構建鏡像時並不執行,而是在它的子鏡像中執行。

USER(設置container容器的用戶)

User nginx

##容器執行時候指定的用戶,默認是root:

arg

格式:ARG<name>[=<default value>]

##解釋:ARG指定了一個變量在docker build的時候使用,可以使用--build-arg <varname>=<value>來指定參數的值,不過如果構建的時候不指定就會報錯。

4.2 構建一個tomcat鏡像示例
一、創建目錄新建Dockerfile和相關包:

[root@docker-registry images]# tree tomcat/

tomcat/

├── apache-tomcat-7.0.55.tar.gz

├── Centos-7.repo

├── Dockerfile

├── epel-7.repo

├── jdk1.8.0_181.tar.gz

├── server.xml

└── supervisord.conf

二、編寫Dockerfile:

[root@docker-registry tomcat]# cat Dockerfile

#pull down centos image

FROM centos:centos7

MAINTAINER [email protected]

ADD epel-7.repo /etc/yum.repos.d/

ADD Centos-7.repo /etc/yum.repos.d/

RUN yum install -y net-tools

RUN yum install -y iputils

RUN yum install -y supervisor

RUN mkdir -p /var/log/supervisor

ADD ./apache-tomcat-7.0.55.tar.gz /opt

ADD ./server.xml /opt/apache-tomcat-7.0.55/conf

ADD ./jdk1.8.0_181.tar.gz /opt

#set environment variable

ENV JAVA_HOME /opt/jdk1.8.0_181

ENV PATH $JAVA_HOME/bin:$PATH

ENV CATALINA_HOME /opt/apache-tomcat-7.0.55

ENV PATH $PATH:$CATALINA_HOME/bin

EXPOSE 8080

COPY supervisord.conf /etc/supervisor/supervisord.conf

CMD supervisord -c /etc/supervisor/supervisord.conf

3、用supervisor來管理進程:

[root@docker-registry tomcat]# cat supervisord.conf

[supervisord]

nodaemon=true

[program:tomcat]

command=/opt/apache-tomcat-7.0.55/bin/catalina.sh run

4、開始構建:

[root@docker-registry tomcat]# docker build -t icfw/tomcat:1.0 .

5、運行:

[root@node3 tomcat]# docker run -dit -p 8080:8080 --name tomcat i/tomcat:1.0

c29c5aaf63a73126e6976c02b1c9bd06e0a0af6514d9c697e1128ddb3a27

[root@docker-registry tomcat]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

fdc4e4f09938 icfw/tomcat:1.0 "/bin/sh -c 'supervi…" 33 seconds ago Up 32 seconds 0.0.0.0:8080->8080/tcp tomcat

6、訪問一下

IP:8080即可。

5 DOCKER 私有倉庫搭建
5.1 下載鏡像倉庫
[root@docker-registry test]# docker pull registry

5.2 啓動並且掛載鏡像倉庫到本地磁盤
[root@docker-registry test]# docker run -d -p 5000:5000 --restart=always -v /registry:/var/lib/registry registry

5.3 上傳鏡像
1、 配置鏡像註冊地址並重啓docker服務:

[root@docker-registry ~]# vi /etc/docker/daemon.json

{"registry-mirrors": ["http://681a96df.m.daocloud.io"],"insecure-registries":["http://192.168.20.20:5000"]}

2、 本地鏡像打個標籤然後上傳:

[root@docker-registry test]# [root@docker-registry test]# docker tag icfw/tomcat:1.0 192.168.20.20:5000/icfw/tomcat:1.0

#192.168.20.20:5000表示倉庫地址,icfw/tomcat表示鏡像名稱,1.0表示版本號。

3、 直接上傳:

[root@docker-registry test]# docker push 192.168.20.20:5000/icfw/tomcat:1.0

4、 上傳完成,我們可以查看一下掛載目錄是否有鏡像:

[root@docker-registry test]# ls /registry/

dockerDocker

5、 關於本地鏡像的查看:

[root@docker-registry test]# curl http://192.168.20.20:5000/v2/_catalog

{"repositories":["icfw/tomcat"]}

6、 看到有兩個鏡像,我們要獲取他的標籤信息以便下載呢:

[root@docker-registry test]# curl http://192.168.20.20:5000/v2/icfw/tomcat/tags/list

{"name":"icfw/tomcat","tags":["1.0"]}

7、 然後我們直接下載鏡像:

[root@docker-registry test]# docker pull 192.168.20.20:5000/icfw/tomcat:1.0

6 使用Docker compose容器編排
Docker Compose是一個用來定義和運行復雜應用的Docker工具。使用Compose,你可以在一個文件中定義一個多容器應用,然後使用一條命令來啓動你的應用,完成一切準備工作。

通過compose構建相關容器編排非常簡單,可以參考官方:

https://docs.docker.com/compose/gettingstarted/#step-4-build-and-run-your-app-with-compose

6.1 compose安裝:
[root@dev-app-server ~]# sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

[root@dev-app-server ~]# chmod +x /usr/local/bin/docker-compose

docker-compose version 1.23.2, build 1110ad01

docker-py version: 3.6.0

CPython version: 3.6.7

OpenSSL version: OpenSSL 1.1.0f 25 May 2017

相關語法:

build 構建或重建服務

help 命令幫助

kill 殺掉容器

logs 顯示容器的輸出內容

port 打印綁定的開放端口

ps 顯示容器

pull 拉取服務鏡像

restart 重啓服務

rm 刪除停止的容器

run 運行一個一次性命令

scale 設置服務的容器數目

start 開啓服務

stop 停止服務

up 創建並啓動容器

6.2 compose的構建語法
docker compose構建語法和相關格式非常簡單,與docker相關命令差不多,我們直接進入實戰部分,構建安全碼系統測試環境:

##image和build必須存在一個,爲了節約時間,我們沒有用dockerfile構建一個鏡像,剩下的指令基本上和docker run一樣的所以這裏不多介紹。

6.3 開始構建和啓動
1、配置文件

[root@dev-app-server vcs-project]# cat docker-compose.yml

version: "2"

services:

framework:

image:  192.168.20.20:5000/icfw/tomcat:1.0

ports:

  - 8080:8080

environment:

   ICFW_FRMEWORK_HOME: /opt/env

volumes:

  - /opt/vcs-project/framework:/opt/apache-tomcat-7.0.55/webapps

  - /opt/vcs-project/env/icfw-framework:/opt/env

  - /opt/vcs-project/icfwfiles:/opt/icfwfiles

vcs:

image:  192.168.20.20:5000/icfw/tomcat:1.0

ports:

  - 8081:8080

environment:

   VCS_HOME: /opt/env

volumes:

  - /opt/vcs-project/vcs:/opt/apache-tomcat-7.0.55/webapps

  - /opt/vcs-project/env/vcs-home:/opt/env

  - /opt/vcs-project/icfwfiles:/opt/icfwfiles

links:

  - framework 

2、創建並啓動

[root@dev-app-server vcs-project]# docker-compose -f docker-compose.yml up -d

Creating vcs-project_framework_1 ... done

Creating vcs-project_vcs_1 ... done

3、刪除指定容器:先停止容器,再執行刪除:

docker-compose -f docker-compose.yml stop vcs

docker-compose -f docker-compose.yml rm vcs ##即可。

6.4 查看日誌
1、 查看啓動日誌

[root@dev-app-server vcs-project]# docker-compose -f docker-compose.yml logs

2、 查看相關狀態:

[root@dev-app-server vcs-project]# docker-compose -f docker-compose.yml ps

     Name                        Command               State           Ports        

vcs-project_framework_1 /bin/sh -c supervisord -c ... Up 0.0.0.0:8080->8080/tcp

vcs-project_vcs_1 /bin/sh -c supervisord -c ... Up 0.0.0.0:8081->8080/tcp

6.5 訪問測試

1、映射web目錄已經添加了framework-web.war,vcs-web.war了,可通過http://192.168.20.15:8080/frmamework-web訪問測試。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章