一、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
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執行命令
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
這個地方只能使用 域名 不能使用ip地址,按此步驟,只能使用域名push
查看倉庫信息:鏡像以及對應的版本
curl https://mint.com:5000/v2/_catalog
curl https://mint.com:5000/v2/mint_busybox/tags/list
拉取倉庫鏡像
docker pull mint.com:5000/mint_busybox
四、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 文件位置
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