docker--學習筆記最後附dockerfile--nginx實例

一、docker簡介

1、Docker優勢

(1)、啓動速度快,秒級實現

(2)、資源利用率高,一臺機器可以跑上千個docker容器

(3)、更快的交付和部署,一次創建也配置後,可以再任意地方運行

(4)、內核級別的虛擬化,不需要額外的hypervisor支持。會有更高的性能和效率

(5)、易遷移,平臺依賴性不強


2、核心概念

鏡像 是一個只讀的模板,類似於安裝系統用的ISO文件,通過鏡像來完成各種應用的部署

容器 鏡像類似於操作系統,而容器類似於虛擬機本身,可以啓動、開始、停止、刪除等操作,每個容器都是相互隔離的

倉庫 存放鏡像的,分爲公開倉庫 和 私有倉庫。


3、常用操作

docker run -t -i centos /bin/bash

-i:標準輸入打開

-t: 分配一個爲終端.

-d:在後臺運行

docker ps -a

docker rmi centos  //鏡像名字 可以加 tag

docker tag centos centos:123456

docker ps

docker start 啓動上一步操作的 容器。。。啓動時支持簡寫

docker exec -it e4 /bin/bash      exec連接容器

docke commit -m "install http" -a "Mint"  ID mintt/centos     最後是新鏡像名字 -m “內容” -a "author" ID 可以簡寫

下載鏡像,導入鏡像

wget https://download.openvz.org/template/precreated/centos-7-x86_64.tar.gz

cat centos-7-x86_64.tar.gz |docker import - opencv-mint-7-x86_64     最後鏡像名字

把現有的鏡像導出爲一個文件

docker save -o ubuntu.tar d355ed3537e9

使用文件恢復本地鏡像

docker load < ubuntu.tar  或者 docker load --input ubuntu.tar  導入 沒有名字以及tag

docker push liqilong/mint


二、docker 容器管理

docker create -it  opencv-mint-7-x86_64

docker start  ID  啓動

docker run -itd  opencv-mint-7-x86_64 /bin/bash    直接在後臺運行

docker exec -it ID   //上步返回的ID      或者 docker attach ID    可以進入

使用attach進入退出終端,容器停止

docker run -d centos:latest bash -c "while :; do echo 123; sleep 1 ; done "

bf649246bc0ea95a6fc3ef7a8c213310bd0ced4d9396441586d778261bd4297f

docker logs bf6

wKiom1luwL2QHNb8AAAW9VNKzBI635.png-wh_50

docker stop bf6
docker run -itd --name Mint_linux centos:latest bash  //指定名字


docker rm ID  刪除容器    docker rm -f ID //強制刪除

docker run --rm -it centos bash -c "sleep 30"  //--rm 可以讓容器退出後直接刪除,在這裏命令執行完容器就會退出,不能和-d一起適用

docker export ID >file.tar    //導出容器,遷移以後需要導入

cat file.tar |docker import - mint_centos        生成mint_centos鏡像


三、Docker倉庫管理

國內registry鏡像地址https://registry.docker-cn.com

docker 刪除所有容器  docker rm $(docker ps -a -q)

刪除所有未運行 Docker 容器

docker rm $
(docker ps -a -q)

刪除所有未打 tag 的鏡像

docker rmi $(docker images -q | awk '/^<none>/ { print $3 }')

刪除所有鏡像

docker rmi $(docker images -q)

根據格式刪除所有鏡像

docker rm $(docker ps -qf status=exited)


registry私庫IP:192.168.1.87

client IP: 192.168.1.88


docker pull registry   //registry    docker官方提供的一個鏡像,使用它來創建本地的docker私有倉庫
docker run -d -p 5000:5000 registy   //以registry鏡像啓動容器,監聽5000端口
docker exec -it ID /bin/sh
openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/mint.com.key -x509 -days 365 -out certs/mint.com.crt
scp -r mint.com.crt [email protected]:/etc/pki/ca-trust/source/anchors/mint.com.crt
update-ca-trust
docker run -d -p 5000:5000 --restart=always --name registry -v `pwd`/certs:/certs -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/mint.com.crt -e REGISTRY_HTTP_TLS_KEY=/certs/mint.com.key registry:2

--restart 標誌會檢查容器的退出代碼,並據此來決定是否要重啓容器,默認是不會重啓。 --restart的參數說明 always:無論容器的退出代碼是什麼,Docker都會自動重啓該容器。 on-failure:只有當容器的退出代碼爲非0值的時候纔會自動重啓。另外,該參數還接受一個可選的重啓次數參數,`--restart=on-fialure:5`表示當容器退出代碼爲非0值時重啓5次

netstat -lnp|grep 5000 //發現監聽5000端口
curl https://mint.com:5000/v2/_catalog --insecure  //到client執行命令

wKiom1luwqbSskXtAAAgeVaUfzM407.png-wh_50

docker push 192.168.1.87:5000/mint_ubuntu

error:

Get https://192.168.1.87:5000/v2/: x509: cannot validate certificate for 192.168.1.87 because it doesn't contain any IP SANs

wKiom1luwsaiqKAlAABL4U5T7io249.png-wh_50

這個地方只能使用 域名 不能使用ip地址,按此步驟,只能使用域名push


查看倉庫信息:鏡像以及對應的版本

curl https://mint.com:5000/v2/_catalog

wKioL1luwwTgd4ytAAAgeVaUfzM910.png-wh_50

 
curl https://mint.com:5000/v2/mint_busybox/tags/list

wKiom1luwxCRuufTAAAjjn1Koqw492.png-wh_50

拉取倉庫鏡像

docker pull mint.com:5000/mint_busybox

wKiom1luwy_DjRVBAABaW-F17Yo976.png-wh_50


四、docker 數據管理

docker run -itd -v /root/data/:/data1 centos /bin/sh /bin/bash   //data本地文件,data1是docker的
docker run -itd --volumes-from. mint_dokcer mint/centos /bin/sh  //使用mintc/entos並且使用MInt_docker的鏡像


共享容器的目錄

1、創建數據容器    、、 -v /root/data/:/data1    直接可以在本地
docker run -itd -v /data/ --name mint_testvol   centos bash     注意這裏的/data/是容器的 /data/目錄,而不是本地的/data/目錄
2、其他容器連接
docker run -itd --volumes-from mint_testvol centos bash
docker run -itd --volumes-from mint_testvol --name= web1  centos bash //數據也是來自mint_testvol

數據卷容器備份恢復

備份:

mkdir vol_data_backup                          //存放位置
docker run -itd --volumes-from mint_testvol -v /root/data/vol_data_backup/:/backup centos bash //掛載目錄   以及在容器裏 打包  tar /backup/data.tar   /data/  執行以後會在 宿主機的/root/data/vol_data_backup目錄下 查看到tar包

恢復:

思路:先建一個數據卷容器,再建一個新的容器並掛載該數據容器,然後再把tar包解壓

docker run -itd -v /data/ --name testvol2 centos bash
docker run --volumes-from testvol2 -v /root/data/vol_data_backup/:/backup centos tar xvf /backup/data.tar

五、docker 網絡模式

1、host模式  使用docker run時使用--net=host  使用宿主機網絡

2、container模式  --net=conrainer:ID或者 name  多個容器使用共同的網絡,看到的IP一樣

3、none模式  使用  --net=none    不會配置任何網絡

4、bridge 模式  默認模式    這種模式會爲每一個容器分配一個獨立的Network Namespace 類似於vmware的nat網絡模式,同一個宿主機上的所有容器會在同一個網段下,相互之間可以通信。

外部訪問容器

docke commit -m "install http" -a "Mint"  ID mint/centos     最後是新鏡像名字 -m “內容” -a "author"

docker run -itd -p 5123:80 centos_with_httpd bash    、、創建新的容器

docker exec -it e14c148 bash     、、進入容器啓動httpd服務

可以通過訪問宿主機的5123端口訪問 容器的 80 端口

docker 容器互聯

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

Connect to MySQL from an application in another Docker container

docker run --name some-app --link some-mysql:mysql -d application-that-uses-mysql

Connect to MySQL from the MySQL command line client

docker run -it --link some-mysql:mysql --rm mysql sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'



六、dockerfile

1 FROM //指定基於那個鏡像

2、MAINTAINER  //指定作者信息   mint [email protected]

3、RUN  //鏡像操作指令

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

RUN yum install httpd     RUN ["/bin/bash","-c","echo hello"]

4、CMD //三種格式  只有最後一個生效

5、EXPOSE  指定要映射出去的端口 啓動容器時 -P 自動分配  -p指定端口

6、ENV    ENV <key> <value>

  ENV MYSQL_VERSION 5.6

7、ADD 格式 ADD <src> <dest> 將本地的一個文件或目錄到容器的某個目錄裏。其中src爲Dockerfile所在目錄的相對路徑 ,也可以是一個url。

ADD <conf/vhost> </usr/local/nginx/conf>

8、CPOY  跟ADD 一樣不支持url

9、ENTRYPOINT 容器啓動時要執行的命令,只有一條生效,多寫只有最後一個生效,

CMD 會被docker run指令覆蓋(docker run 時最後的bash 會覆蓋dockerfile的CMD),而ENTRYPOINT 不能被覆蓋,並且比CMD或者docker run 指定的命令靠前執行

10、VOLUME 格式 VOLUME ["/data"]

創建一個可以從本地主機或其它容器掛載的掛載點

11 USER  格式 USER daemon

指定容器運行的用戶

12、WORKDIR 格式 WORKDIR /path/to/workdir

爲後續的RUN、CMD、ENTRYPOINT 指定工作目錄

The <dest> is an absolute path, or a path relative to WORKDIR, into which the source will be copied inside the destination container.

dockfile創建鏡像----nginx

cat dockerfile 

#Based on Centos
#Date :2017 07 18
#Auth :mint

FROM centos
MAINTAINER mint [email protected]

# install necessary tools

RUN yum install -y pcre-devel wget net-tools gcc zlib zlib-devel make openssl-devel
#install Nginx
#ADD http://nginx.org/download/nginx-1.12.1.tar.gz .
#第一次使用ADD報錯 路徑有問題,問題解決了,ADD 拉取的是解壓好的包,直接進入編譯就行不需要解壓

RUN wget  http://nginx.org/download/nginx-1.12.1.tar.gz
RUN tar zxvf nginx-1.12.1.tar.gz
RUN mkdir -p /usr/local/nginx
RUN cd nginx-1.12.1 && ./configure --prefix=/usr/local/nginx && make && make install
#RUN rm -rf /usr/local/nginx/conf/nginx.conf
#COPY .nginx_conf /usr/local/nginx/conf/nginx.conf

EXPOSE 80

#CMD /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
#執行以後容器停止

docker build -t centos_nginx .      //-t 生成鏡像的名字   . dockerfile 文件位置

wKiom1luxJ-iKmKVAAAa-Ckpv4A688.png-wh_50


docker run --itd --name centos_nginx -P centos_nginx bash



歡迎打算使用阿里雲服務器的小夥伴,加我私聊!!QQ:3533470970  或直接領取阿里雲幸運券:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=b6h928qb&utm_source=b6h928qb

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