1. 程式人生 > >Docker 入門學習

Docker 入門學習

鏡像 格式 daemon 一行 onf ase 作者 服務端 管理

初識docker

docker在開發和運維中的優勢:

1)更快速的交付和部署

2)更高效的資源利用

3)更輕松的遷移和擴展

4)更簡單的更新管理

docker與虛擬機的比較

技術分享

技術分享

docker的核心概念和安裝

docker鏡像:鏡像(image)是創建docker容器的基礎,類似於虛擬機鏡像,一個面向docker引擎的只讀模板,包含了文件系統。

docker容器:(container)類似於一個輕量級的沙箱,Docker利用容器來運行和隔離應用.可以看做一個簡易版得到liux系統。可以對容器進行啟動,開始,停止,刪除。

docker倉庫:docker倉庫類似於代碼庫,是docker集中存放鏡像的文件場所。

鏡像

獲取鏡像

$sudo docker pull NAME[:TAG] 不顯式指定tag號,默認使用latest標簽。 e.g. $ sudo docker pull ubuntu14.04

指定倉庫下載鏡像並啟動容器:$ sudo docker pull dl.dockerpool.com:5000/ubuntu $ sudo docker run -t -i ubuntu /bin/bash

查看鏡像信息

查看本地鏡像信息:$ sudo docker images

修改本地鏡像標簽:$ sudo docker tag dl.dockerpool.com:5000/ubuntu:latest ubuntu:latest

獲取鏡像的詳細信息,以JSON返回:$ sudo docker inspect 5506de2b643b inspect後面+鏡像ID

搜尋鏡像

docker search 命令可以搜索遠端倉庫中共享的鏡像,默認搜索 Docker Hub
方倉庫中的鏡像。用法為 docker search TERM 。

刪除鏡像

使用鏡像標簽刪除鏡像

$ sudo docker rmi dl.dockerpool.com:5000/ubuntu

註意:當同一個鏡像擁有多個標簽的時候, docker rmi 命令只是刪除了該鏡像多個標簽中的指定
標簽而已,並不影響鏡像文件。但當鏡像只剩下一個標簽的時候就要小心了,此時再使用 docker rmi 命令會徹底刪
除該鏡像 。


創建鏡像

基於已有鏡像的容器創建

命令格式為 docker commit [OPTIONS]
CONTAINER [REPOSITORY[:TAG]],主要選項包括:
-a, --author="" 作者信息。
-m, --message="" 提交消息。
-p, --pause=true 提交時暫停容器運行。

e.g. $ sudo docker commit -m "Added a new file" -a "Docker Newbee" a925cb40b3f0 test 其中a925cb40b3f0 為容器ID

基於本地模板導入

$ sudo cat ubuntu-14.04-x86_64-minimal.tar.gz |docker import - ubuntu:14.04

基於dockerfile

存出和載入鏡像

可以使用 docker save docker load 命令來存出和載入鏡像。

上傳鏡像

$ sudo docker tag test:latest user/test:latest
$ sudo docker push user/test:latest

容器

新建容器

Sudo Docker create -it ubuntu:latest

Sudo docker start 容器ID

啟動容器

Sudo docker run -t -i ubuntu /bin/bash

Ctrl+p ctrl+q 後臺運行 exit 退出

守護態運行

技術分享

Sudo docker logs 容器ID

終止容器

Sudo docker stop/restart/start 容器ID

進入容器

技術分享

刪除容器

-f

技術分享

數據管理

數據卷

技術分享

數據卷容器

1)創建一個數據卷容器dbdate 然後創建一個數據卷掛載到 /dbdata

技術分享

數據備份

技術分享

網絡基礎配置

技術分享

使用dockerfile創建鏡像

Dockerfile是一個文本格式的配置文件,用戶可以使用Dockerfile快速創建自定義的鏡像。

基礎結構

一般而言,dockerfile分為字部分:基礎鏡像信息,維護者信息,鏡像操作指令和容器啟動時執行指令。
# This dockerfile uses the ubuntu image
#VERSION 2 - EDITION 1
#Author:docker_user
#Command format: Instruction [arguments/command]

#第一行必須指定基礎鏡像
FROM shc-harbor-dev.hpeswlab.net/itsma/itom-itsma-opensuse-base:2017.04.26

#維護者信息
MAINTAINER docker_user [email protected]

#鏡像的操作指令     每運行一次RUN命令,鏡像添加新的一層,並提交。
RUN echo "deb http:// archive.ubuntu.com" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf

#容器啟動時執行指令
CMD /usr/sbin/nginx

指令

1.FROM

第一條指令必須為FROM指令。如果同個Dockerfile中創建多個鏡像,可以使用多個FROM指令。

格式FROM <image> 或 FROM <image>:<tag>

2.MAINTAINER

格式為 MAINTAINER <name>,指定維護者信息。

3.RUN

格式為RUN <command>

每條RUN指令將在當前鏡像基礎上執行命令,並提交為新的鏡像。當命令較長時可以使用\來換行。

4.CMD

CMD 指令的格式和 RUN 相似,也是兩種格式:

  • shell 格式:CMD <命令>
  • exec 格式:CMD ["可執行文件", "參數1", "參數2"...]
  • 參數列表格式:CMD ["參數1", "參數2"...]。在指定了 ENTRYPOINT 指令後,用 CMD 指定具體的參數。

5.EXPOSE

告訴docker服務端容器暴露的端口號,供互聯系統使用。使用-p指定主機端口映射。

EXPOSE 22 80 8443

docker run -d -p 127.0.0.1:33301:22 centos6-ssh

6.ENV

格式為ENV <key> <value>

指定環境變量

7.ADD

格式ADD <src> <dest>

該命令將復制指定的<src>到容器的<dest>.其中<src>可以是Dockerfile所在目錄的一個相對路徑(文件和目錄);也可以是URL。

8.COPY

格式為COPY <src> <dest>

復制本地主機的<src>至 容器<dest>,目標路徑不存在時會自動創建。當使用本地目錄為源目錄時,推薦使用COPY。

9.ENTRYPOINT

container啟動時執行的命令,但是一個Dockerfile中只能有一條ENTRYPOINT命令,如果多條,則只執行最後一條

ENTRYPOINT沒有CMD的可替換特性。

10.VOLUME

可以將本地文件夾或者其他container的文件夾掛載到container中。

VOLUME ["/data1","/data2"]

11.USER

格式為USER daemon

指定運行容器時的用戶名或UID,後續的RUN也會使用指定用戶。

12.WORKDIR

格式為WORKDIR /path/to/workdir

切換目錄用,可以多次切換(相當於cd命令),對RUN,CMD,ENTRYPOINT生效

WORKDIR /a

WORKDIR b

WORKDIR c

最終:/a/b/c

13.ONBUILD

格式為ONBUILD [ INSTRUCTION]

ONBUILD 指定的命令在構建鏡像時並不執行,而是在它的子鏡像中執行.當創建的鏡像作為基礎鏡像時所執行的操作指令。

創建鏡像

docker build[選項] 路徑

指定dockerfile所在路徑為/tmp/docker_buider/ ,並且希望 生成鏡像標簽為build_repo/first_image :

$sudo docker build -t build_repo/first_image /tmp/docker_builder/

e.g. Dockerfile

技術分享
FROM shc-harbor-dev.hpeswlab.net/itsma/itom-itsma-opensuse-base:2017.04.26


# set proxy
ENV http_proxy @{http.proxy}


#install wget
RUN zypper --non-interactive install wget tar && zypper clean

# install Nodejs 6.91
RUN wget http://nodejs.org/dist/v6.9.1/node-v6.9.1-linux-x64.tar.gz -P /app  && tar -vzxf /app/node-v6.9.1-linux-x64.tar.gz -C /app  && rm -rf /app/node-v6.9.1-linux-x64.tar.gz


#set node environment
ENV NODE_HOME /app/node-v6.9.1-linux-x64/bin
ENV PATH $NODE_HOME:$PATH
ENV http_proxy ""

RUN mkdir -p /pv/itsma/conf /app/yaml_output /app/config-service/yamls  /itsma-certificate/upload  /itsma-certificate/bundle

COPY configure-ui.tar.gz /app/
#COPY smarta-admin-ui.tar.gz /app/
COPY configure-backend.jar /app/config-service/configure-backend.jar
#COPY /var/vols/itom/core/suite-install/itsma/services/sm/*.yaml /app/config-service/yamls/
COPY configmap_property.json /app/yaml_output
COPY sm-post-pod.yaml /app/config-service/yamls/
COPY run.sh /app
COPY ssl.sh /app

RUN tar -C /app -xzf /app/configure-ui.tar.gz     && rm -rf /app/configure-ui.tar.gz     && chmod 500 /app/run.sh     && chmod 755 /app/ssl.sh 


# copy smart admin page
#RUN cp /app/smarta-admin-ui/* /app/configure-ui/dist/

# for security
RUN groupadd itsma_config -g 1999 && useradd itsma_config -u 1999 -g 1999 && chown -R itsma_config:itsma_config /app && echo "root:bmVlZGNoYW5nZWQ=" | chpasswd && echo "itsma_config  ALL=NOPASSWD: /usr/bin/ln"  >> /etc/sudoers

EXPOSE 8080

WORKDIR /app

USER itsma_config

CMD ["/app/run.sh"]
View Code

Docker 入門學習