Docker學習筆記python
https://yeasy.gitbooks.io/docker_practice/content/linux
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
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
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 是一個文本文件,其內包含了一條條的指令(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 hostport:dockerport 實現端口映射
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
基於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