Docker學習筆記總結

 

Docker學習筆記python

https://yeasy.gitbooks.io/docker_practice/content/linux

 

一 環境搭建

Ubuntu安裝

1.添加軟件源的GPG密鑰

curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

2.添加Docker軟件源

sudo add-apt-repository \

    "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \

    $(lsb_release -cs) \

stable"

3.安裝軟件

sudo apt-get update

Sudo apt-get install docker-ce

Centos安裝

1.安裝依賴包

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

 

2.添加軟件源

sudo yum-config-manager \

    --add-repo \

https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3.安裝docker CE

sudo yum makecache fast

sudo yum install docker-ce 

修改加速器服務

1.vim /etc/default/docker

DOCKER_OPTS="--registry-mirror=https://jxus37ad.mirror.aliyuncs.com"

2.sudo service docker restart 

二 鏡像製做

鏡像構成

  當咱們運行一個容器的時候(若是不使用卷的話),咱們作的任何文件修改都會被記錄於容器存儲層裏。而 Docker 提供了一個 docker commit 命令,能夠將容器的存儲層保存下來成爲鏡像。換句話說,就是在原有鏡像的基礎上,再疊加上容器的存儲層,並構成新的鏡像。之後咱們運行這個新鏡像的時候,就會擁有原有容器最後的文件變化。nginx

 

使用commit製做鏡像

docker commit 的語法格式爲:

docker commit [選項] <容器ID或容器名> [<倉庫名>[:<標籤>]]

 

docker run --name webserver -d -p 80:80 nginx

docker commit --author "tla001" --message "edit page" webserver nginx:v2 

  docker commit 命令除了學習以外,還有一些特殊的應用場合,好比被入侵後保存現場等。可是,不要使用 docker commit 定製鏡像,定製行爲應該使用 Dockerfile 來完成。形成鏡像臃腫c++

使用Dockerfile定製鏡像

  Dockerfile 是一個文本文件,其內包含了一條條的指令(Instruction),每一條指令構建一層,所以每一條指令的內容,就是描述該層應當如何構建。git

  除了選擇現有鏡像爲基礎鏡像外,Docker 還存在一個特殊的鏡像,名爲 scratch。這個鏡像是虛擬的概念,並不實際存在,它表示一個空白的鏡像。若是你以 scratch 爲基礎鏡像的話,意味着你不以任何鏡像爲基礎,接下來所寫的指令將做爲鏡像第一層開始存在。web

指令詳解docker

RUN

COPY 注意上下文目錄



ADD 高級的複製,原路徑能夠是URL



CMD  exec 格式:CMD ["可執行文件", "參數1", "參數2"...]

  在指令格式上,通常推薦使用 exec 格式,這類格式在解析時會被解析爲 JSON 數組,所以必定要使用雙引號 ",而不要使用單引號

CMD [ "sh", "-c", "echo $HOME" ]

  容器中的應用都應該之前臺執行,對於容器而言,其啓動程序就是容器應用進程,容器就是爲了主進程而存在的,主進程退出,容器就失去了存在的意義,從而退出,其餘輔助進程不是它關係你的東西



ENTRYPOINT 入口點



ENV 設置環境變量 ENV <key1>=<value1> <key2>=<value2>...

  下列指令能夠支持環境變量展開: ADD、COPY、ENV、EXPOSE、LABEL、USER、WORKDIR、VOLUME、STOPSIGNAL、ONBUILD。 



ARG構建參數

ARG <參數名>[=<默認值>]

構建參數和 ENV 的效果同樣,都是設置環境變量。所不一樣的是,ARG 所設置的構建環境的環境變量,在未來容器運行時是不會存在這些環境變量的

該默認值能夠在構建命令 docker build 中用 --build-arg <參數名>=<值> 來覆蓋

 

VOLUME 定義匿名卷

VOLUME ["<路徑1>", "<路徑2>"...]

  在 Dockerfile 中,咱們能夠事先指定某些目錄掛載爲匿名卷,這樣在運行時若是用戶不指定掛載,其應用也能夠正常運行,不會向容器存儲層寫入大量數

 

EXPOSE 聲明運行時容器提供服務的端口

   要將 EXPOSE 和在運行時使用 -p <宿主端口>:<容器端口> 區分開來。-p,是映射宿主端口和容器端口,換句話說,就是將容器的對應端口服務公開給外界訪問,而 EXPOSE 僅僅是聲明容器打算使用什麼端口而已,並不會自動在宿主進行端口映射

  

WORKDIR 指定工做目錄



USER指定當前用戶  USER 指令和 WORKDIR 類似,都是改變環境狀態並影響之後的層。WORKDIR 是改變工做目錄,USER 則是改變以後層的執行 RUN, CMD 以及 ENTRYPOINT 這類命令的身份

 

其它製做鏡像的方法數據庫

從 rootfs 壓縮包導入ubuntu

docker import [選項] <文件>|<URL>|- [<倉庫名>[:<標籤>]]vim

保存鏡像

docker save alpine | gzip > alpine-latest.tar.gz

導入鏡像

docker load -i alpine-latest.tar.gz

 

  若是咱們結合這兩個命令以及 ssh 甚至 pv 的話,利用 Linux 強大的管道,咱們能夠寫一個命令完成從一個機器將鏡像遷移到另外一個機器,而且帶進度條的功能:

  docker save <鏡像名> | bzip2 | pv | ssh <用戶名>@<主機名> 'cat | docker load'

 

三 操做容器

Docker pull

docker pull centos

 

Docker run

Docker run -ti centos bash

 

Docker images

虛懸鏡像docker images -f dangling=true

Docker rmi 刪除鏡像

Docker logs id 查看日誌

Docker stop id 刪除容器

Docker attach 鏈接容器

Docker rm 刪除容器

Docker search 搜索鏡像

 

docker export 7691a814370e > ubuntu.tar 導出容器快照

cat ubuntu.tar | sudo docker import - test/ubuntu:v1.0 導入容器快照

docker import http://example.com/exampleimage.tgz example/imagerepo 導入URL

Docker load與 Docker import的區別

用戶既可使用docker load來導入鏡像存儲文件到本地鏡像庫,也可使用docker import來導入一個容器快照到本地鏡像庫。這二者的區別在於容器快照文件將丟失全部的歷史記錄和元數據信息(即僅僅保存容器當時的快照狀態),而鏡像存儲文件將保存完整記錄,體積也較大。此外,從容器快照文件導入時,能夠從新指定標籤等元數據信息

 

四 數據卷

數據卷是一個可供一個或多個容器使用的特殊目錄,它繞過 UFS,能夠提供不少有用的特性:

  • 數據卷能夠在容器之間共享和重用
  • 對數據卷的修改會立馬生效
  • 對數據卷的更新,不會影響鏡像
  • 數據卷默認會一直存在,即便容器被刪除

*注意:數據卷的使用,相似於 Linux 下對目錄或文件進行 mount,鏡像中的被指定爲掛載點的目錄中的文件會隱藏掉,能顯示看的是掛載的數據卷。

 

添加數據卷

Docker run -v 

刪除數據卷

Docker rm -v

查看數據卷

Docker inspect id

 

數據卷容器

就是一個正常的容器,專門用來提供數據卷供其餘容器掛在的

sudo docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres

sudo docker run -d --volumes-from dbdata --name db1 training/postgres

sudo docker run -d --volumes-from dbdata --name db2 training/postgres

 

數據庫容器

docker run -d --name db training/postgres

建立新容器鏈接到db

docker run -d -P --name web --link db:db training/webapp python app.py

--link 參數的格式爲 --link name:alias,其中 name 是要連接的容器的名稱,alias 是這個鏈接的別名。

 

五 網絡

-p hostportdockerport 實現端口映射

Docker與宿主機同一網段的實現

sudo docker network create mynet --subnet 219.216.88.0/24 --gateway 219.216.88.254 -o parent eth0

sudo docker run -ti -d --name webserver --net mynet --ip 219.216.88.111 nginx:v3 bash

 

六 Dockfile實戰

基於centos7搭建nginx鏡像

1.準備工做

pull centos

mkdir mynginx

cd mynginx

下載nginx源碼 

http://nginx.org/download/nginx-1.12.1.tar.gz

下載pcre源碼 

ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.38.tar.gz

將源碼拷貝到mynginx目錄

2.建立Dockerfile

FROM centos

MAINTAINER tla001

 

WORKDIR /usr/local/src/

COPY pcre-8.38.tar.gz .

COPY nginx-1.12.1.tar.gz .

RUN useradd -s /sbin/nologin www  && yum install vim gcc gcc-c++ openssl openssl-devel net-tools -y

RUN tar zxf pcre-8.38.tar.gz   &&  cd pcre-8.38 && ./configure --prefix=/usr/local/pcre  && make && make install

RUN tar zxf nginx-1.12.1.tar.gz && cd nginx-1.12.1 && ./configure --prefix=/usr/local/nginx  \ 

--user=www  \

--group=www \

--with-http_ssl_module  \

--with-http_stub_status_module \ 

--with-file-aio  \

--with-http_dav_module \

--with-pcre=/usr/local/src/pcre-8.38 && make && make install && chown -R www. /usr/local/nginx

#COPY nginx.conf /usr/local/nginx/conf/nginx.conf

#ADD vhosts /usr/local/nginx/conf/vhosts

ADD run.sh /root/run.sh

RUN chmod 755 /root/run.sh

    

CMD ["/root/run.sh"]

EXPOSE 80 443

 

 

3.編譯

sudo docker build -t nginx:v4 .

4.運行

sudo docker network create mynet  --subnet 219.216.88.0/24 --gateway 219.216.88.1 -o parent=eth0

sudo docker run -ti -d --name webserver --net mynet --ip 219.216.88.111 nginx:v4

相關文章
相關標籤/搜索