docker學習筆記整理
1、理解
1.1 docker 是什麼
- 開源的軟件部署解決方案
- 輕量級的應用容器框架
- 可以打包、發佈、運行任何應用
1.2 docker 學習網站推薦
- 菜鳥網:https://www.runoob.com/docker/docker-tutorial.html
- docker中文網:http://www.docker.org.cn/book/docker/what-is-docker-16.html
- docker 源碼:https://github.com/docker/docker-ce
1.3 docker 的核心概念
- 倉庫(Repository)
- 用於存放鏡像文件
- docker 倉庫有很多個,如國內的阿里雲、網易雲、DaoCloud、國外的docker hub、Quay等,選擇合適的倉庫,可以提高資源獲取效率 docker
- 倉庫中存在很多不同的鏡像,如:centos6、centos7、ubuntu10、buntu11、jeinkins、python、mysql、php、tomcat、apache等等
- 鏡像(Image)
- 類似於rar、zip的壓縮包,我們可以將一系列文件統一打包成一個壓縮文件,方便傳輸、下載和使用
- 鏡像文件是可讀的;運行容器時,只是在鏡像上面創建了一個可寫層,而鏡像本身不會發生變化
- 例如我們可以從 docker 倉庫中下載 centos6、 jenkins 等鏡像;
- 容器(container)
- 容器 = 鏡像+ 讀寫層; 可以理解爲 java 的類和對象, 鏡像是類,容器是對象。
- 一個鏡像可以創建很多個容器, 並且這些容器都可以獨立運行,任何一個停掉也不會影響另一個
1.4 docker 的優點
- 高效構建應用——使用命名一鍵式部署
- 快速交付和部署——搭配jenkins持續集成
- 遷移擴展性強——將容器打包成鏡像,移植到新的機器上
- 更新管理方便——使用可視化工具管理(如:protainer)
- 啓動速度快——秒級
- 同時支持上千個容器
- 隔離性強——各個容器互不干擾
2、安裝 (centos 爲例)
- 安裝所需軟件包: yum install -y yum-utils device-mapper-persistent-data
lvm2 - 設置倉庫:yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- 安裝Docker Engine-Community: yum install docker-ce docker-ce-cli containerd.io
- 列出可用版本: yum list docker-ce --showduplicates | sort -r
- 安裝: yum install docker-ce-18.09.1 docker-ce-cli-18.09.1 containerd.io
- 啓動docker: systemctl start docker
- 驗證安裝成功: docker run hello-world
3、容器使用常用命令
- 運行容器:docker run -i -t ubuntu:15.10 /bin/bash
- -i 交互式運行
- -t 終端模式
- -d 後臺運行(不會進入容器) 如:docker run -d ubuntu:15.10 /bin/sh -c “while true; do echo working; sleep 60;done”
- -P 容器端口映射到主機隨機端口
- -p 容器端口映射到主機指定一個端口 (如加了ip,則默認爲 tcp 端口, 如果要綁定udp 端口, 需要在端口後加上 /udp)
- –name 命名容器
- –dns=8.8.8.8 指定dns
- 進入後臺容器: docker attach 或者 docker exec ( exec 退出容器時,容器不會停止)
- 退出交互式容器:ctrl + D 或者 exit 退出交互式容器
- 啓動容器: docker start name 或者 docker start id
- 停止容器: docker stop name 或者 docker stop id
- 重啓容器: docker restart name 或者 docker restart id
- 導出容器: docker export 1e5 > /dev/ubuntu.tar
- 導入容器:cat /dev/ubuntu.tar | docker import - test/ubuntu:v1 (將
ubuntu.tar 導入到頸項 test/ubuntu:v1 - 導入容器: docker import http://example.com/exampleimage.tgz
example/imagerepo 通過URL 導入 - 刪除容器:docker rm -f id (刪除前要先停止運行)
- 清除所有終止的容器:docker container prune
- 端口查看: docker port id/name
- 查看狀態: docker ps 或 docker ps -a (-a 展示所有運行過的容器 -l 顯示最後一個運行的容器)
- 查看運行日誌: docker logs name/id 或 docker logs -f name/id ( -f
持續標準輸出) - 查看容器進程: docker top id/name
- 查看容器底層信息: docker inspect id/name
- 與宿主機傳文件: docker cp container_id:/root/test /root (容器 拷貝到宿主機)
4、關於鏡像的命令
- 列出本機鏡像:docker images ( 使用 docker run 運行鏡像)
- 預下載鏡像: docker pull 鏡像名
- 搜索鏡像: docker search httpd
- 刪除鏡像: docker rmi hello-world
- 更新鏡像: 進入容器終端,使用 apt-get update ; 然後退出終端,使用 docker commit -m=“comments” -a=“author” 容器id 目標鏡像名 提交鏡像
- 創建鏡像:
1、 從已經創建的容器更新鏡像,再提交;
2、使用 dockerfile 創建新鏡像 - 構建鏡像:創建Dockerfile 文件, 通過 docker build 執行Dockerfile 來構建鏡像
$ cat Dockerfile
FROM centos:6.7
MAINTAINER Fisher "[email protected]"
RUN /bin/echo 'root:123456' |chpasswd
RUN useradd runoob
RUN /bin/echo 'runoob:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
$ docker build -t runoob:centos:6.7 /root # /root 爲Dockerfile 所在位置
- 設置鏡像標籤 : docker tag image_id tag_name
5、實例之運行一個web應用容器
$ docker pull training/webapp # 載入鏡像
$ docker run -d -P training/webapp python app.py # -d 後臺運行 -P 端口映射到主機的隨機一個端口
$ docker ps
$ docker run -d -p 5000:5000 training/webapp python app.py # -p 端口映射到主機的指定一個端口
6、容器連接
$ docker network create -d bridge test-net # -d 指定網絡類型爲 bridge
# 後臺運行2個容器 test1、 test2 ,指定網絡爲 test-net
$ docker run -id --name test1 --network test-net centos /bin/bash
$ docker run -id --name test2 --network test-net centos /bin/bash
# 查看test1、tesst2 運行正常
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
428af62a7e37 centos "/bin/bash" 7 minutes ago Up 7 minutes test2
879f20b21768 centos "/bin/bash" 7 minutes ago Up 7 minutes
test1
# 驗證 test1、test2 網絡互通
$ docker exec -it test1 /bin/bash
$ ping test2
7、 docker 可視化工具
這裏推薦portainer (docker ui 沒有賬號權限控制,功能簡單,沒命令號; k8s 需要多臺機器部署):
$ docker pull portainer/portainer
$ docker run -id --name protainer -p 9000:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer #單機版
$ #集羣版:
$ docker run -id --name portainer -p 9000:9000 --restart=always portainer/portainer