docker先入門後學習各知識模塊

base Ubuntu 16.04

簡單入門操作

安裝

sudo apt-get remove docker docker-engine docker-ce docker.io
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common  (使apt能接受https的ppa庫)
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -       (docker官方GPG密鑰)
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"     (ppa庫,這個地址好像不是很好用,在某些網絡下會失敗,成功率與各自網絡有關。出現網絡問題的話,有條件的同學可以考慮科學上網)
sudo apt-get update
sudo apt-get install -y docker-ce      (安裝最新版)
如果不想要最新版:
apt-cache madison docker-ce       (查看版本列表)
sudo apt-get install docker-ce=<VERSION>      (指定版本安裝

創建docker用戶組

sudo groupadd docker            (應該不需要執行,已經有了)
sudo usermod -aG docker $USER     (將當前用戶添加到附加組羣docker)
重新登錄用戶賬戶使生效

驗證

systemctl status docker     (啓動狀態)
sudo systemctl start docker    (啓動,或 sudo service docker start)
sudo docker run hello-world     (官方提供hello world程序)

創建鏡像並運行生成容器

新建名稱爲Dockerfile的文件(無後綴名),輸入如下內容並保存:

FROM ubuntu:16.04

RUN \
    apt-get update &&\
    apt-get install -y openjdk-8-jdk &&\
    rm -rf /var/lib/apt/lists/*

ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64
ENV LANG C.UTF-8

CMD ["/bin/bash"]

文件中,繼承了ubuntu的docker鏡像(ubuntu:16.04)的16.04版本
在該目錄下直接執行以下命令新建鏡像:
docker build -t mytest/jdk:1.8 .        (運行過程較長。不要漏了最後的點,最後那個點代表當前目錄,倒二參數鏡像名可任意設置,-t 爲tag) 
docker images            可看到mytest/jdk:1.8已進入現有鏡像列表中
docker run -p 80:8080 -it mytest/jdk:1.8          啓動docker鏡像新建立一個容器(-p 表示將主機80端口映射到容器內部的8080端口,此例中端口映射沒有什麼意義,只是爲了說明,--name=myname :手動分配名字,-t 僞tty終端,-d 守護進程的方式後臺執行(默認交互進程方式),CMD爲.需要保持tty終端連接的運行命令時需要-d否則sh執行完docker就退出了),如果Dockerfile中沒有定義命令CMD運行不成功,這時可在docker run的最後面添加運行命令手動指定
運行成功後,在容器內輸入命令:java -version 可看到jdk已經安裝成功

 

模塊化知識點

docker概念

Docker客戶端        命令行允許時給客戶端發送命令,客戶端分發到指定容器
Docker Daemon 守護進程        docker允許依賴的進程
Docker Image 鏡像        docker啓動前需要指定之前製作的鏡像(即源碼,只讀模式)
Docker Container 容器        docker運行鏡像的拷貝於虛擬機上(運行後的鏡像爲叫容器,即鏡像的實例,讀寫模式),可對其停止運行,重新運行,內部命令操作,修改後重新打包爲新鏡像,一個鏡像可運行爲多個容器
Docker Registry 倉庫        docker鏡像存儲的位置,有公有倉庫與私有倉庫
交互式容器與守護式容器        交互式容器:當前命令進程執行完畢容器即退出;守護式容器:當前命令進程與該進程啓動的進程都運行完畢才退出,通常沒有交互式程序時使用

容器停止與啓動

docker stop 8d43            停止正在運行的容器(發出結束的信號,8d43爲通過docker ps 查看到的name前面幾個字符,stop時name無須填完整,只要docker能識別不引起歧義就行)
docker start -i 8d43            重新運行容器(-i 標準輸入始終打開)
docker kill 8d43            快速強制停止容器

容器與鏡像的刪除

docker rm 8d43            刪除已經停止的容器(需先停止容器)
docker rmi uettydkr/test:1.0            刪除鏡像(需先刪除該鏡像的所有容器實例)

容器網絡設置

端口映射
docker run -P -i -t uettydkr/test:1.0            對容器暴露的所有端口進行映射
docker run -p 8080 -i -t uettydkr/test:1.0            指定容器8080端口映射到宿主機的隨機端口
docker run -p 80:8080 -i -t uettydkr/test:1.0            容器的8080端口映射到宿主機的80端口
docker run -p 0.0.0.0:8080 -i -t uettydkr/test:1.0            指定容器ip和容器的端口
docker run -p 0.0.0.0:80:8080 -i -t uettydkr/test:1.0            指定容器ip,容器8080端口映射到宿主機的80端口
docker port 8d43            查看端口映射情況
docker run --net=host -i -t uettydkr/test:1.0             --net=host 將使容器與宿主機共用端口(較少使用),可能導致容器內新啓動的程序的端口會與宿主機發生衝突

使用bridge-utils進行網橋操作
安裝:sudo apt-get install bridge-utils
驗證:sudo brctl show
添加一個新的網橋:sudo brctl addbr mybr0 && sudo ifconfig mybr0 192.168.200.1 netmask 255.255.255.0

網絡地址
修改dockers網絡地址ip網段:sudo ifconfig docker0 192.168.192.1 netmask 255.255.255.0 && sudo service docker restart
修改docker使用的網橋爲mybr0:
vim /etc/default/docker
在DOCKER_OPTS中添加參數 DOCKER_OPTS=" -b=mybr0 " ,重啓docker service

容器互聯LINK方式
默認是允許所有容器互相連接
使用給容器ip地址設置別名(不設置別名的情況下,默認設置下通過ip實際也能訪問),避免重啓ip變化:
容器1:docker run -it --name=c1 ubuntu:16.04
容器2連接容器1:docker run -it --name=c2 --link=c1:host1 ubuntu:16.04     在容器2內部輸入命令env或者cat /etc/hosts可看到影響情況
修改默認互聯規則爲拒絕:DOCKER_OPTS中添加 --icc=false ,重啓docker service
特定容器連接:DOCKER_OPTS中添加 --icc=false外,還需要 --iptables=true 讓docker容器把配置添加到iptables設置中,並且容器需用--link選項,需先將iptables的設置清空(sudo iptables -F),並且重啓啓動docker,查看iptables設置(sudo iptables -L -n)

容器互聯BRIDGE方式
創建一個網橋:docker network create mysql-ms
指定網橋及網絡別名啓動
docker run -it --name=mysql-m1 --network=mysql-ms --network-alias=mysql-m1 uetty/mysql:5.7.23
docker run -it --name=mysql-s1 --network=mysql-ms --network-alias=mysql-s1 uetty/mysql:5.7.23

容器與外部網絡連接
默認是允許與外部網絡連接
通過sudo sysctl net.ipv4.conf.all.forwarding可查看系統ipforward值
設置禁止容器與外部網絡連接DOCKER_OPTS添加 --ip-forward=false,重啓docker service
設置容器(172.17.0.2)80端口不被特定ip(111.11.11.11)訪問(通過iptables):sudo iptables -I DOCKER -s 111.11.11.11 -d 172.17.0.2 -p TCP --dport 80 -j DROP

遠程鏡像倉庫

https://hub.docker.com/           docker官方倉庫地址
docker search ubuntu             --automated=false true時只選中自動化構建出的鏡像;--no-trunc=false true時不以截斷的方式輸出;-s或--stars=0 限制顯示結果的最低星級
docker pull ubuntu:14.04            從遠程拉取鏡像
docker login           登陸遠程鏡像倉庫,之後會提示輸入賬戶和密碼
docker push uetty/test:1.0            將鏡像push到遠程鏡像倉庫(須在docker hub創建有賬戶,並創建這個倉庫,本地執行過登陸)

修改鏡像倉庫鏡像地址加速拉取: 1. 修改: /etc/default/docker;2. 添加 DOCKER_OPTS="--registry-mirror=http://MIRROR-ADDR"
國內可以選擇daocloud.io 註冊賬號後選擇加速器生成鏈接:如:http://ae6fed91.m.daocloud.io

構建自己的鏡像

通過commit容器的方式構建鏡像
1. 先從公共鏡像倉庫中拉曲一個ubuntu鏡像:docker pull ubuntu:16.04
2. 使用該鏡像啓動一個容器:docker run -d --name ubuntu-nginx ubuntu:16.04 /bin/bash
3. 進入容器:docker exec -it ubuntu-nginx /bin/bash
4. 安裝自己的軟件(nginx):apt-get update && apt-get install nginx
5. 安裝完畢後退出容器:ctrl + p && ctrl + q
6. 提交容器生成鏡像:docker commit -a "uetty" -m "nginx" b9fa70 uetty/nginx            生成鏡像名爲uetty/nginx(-a 作者信息;-m 鏡像信息描述)
7. 接下來有需要的話可以把鏡像提交到遠程倉庫中
通過Dockerfile的方式構建鏡像
前面入門操作->創建鏡像並運行生成容器 中已經介紹

遠程訪問

需保證Client API與Server API版本一致,修改啓動選項區別服務器

服務端(server_1)環境
修改啓動選項sudo vim /etc/default/docker,輸入
DOCKER_OPTS=" --label name=docker_server_1 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"    --label給服務器上標籤,通過docker info可看到label值,-H 接受三種形式:tcp://host:port,unix:///path/to/socket(默認),fd://* or fd://socketfd,-H 可指定多個,爲了保證本地客戶端不被影響應加上unix方式
sudo service docker restart     重啓生效
curl http://xx.xx.xx.xx:2375/info            檢測
docker -H tcp://xx.xx.xx.xx:2375 info    客戶端訪問

客戶端(server_2)遠程連接
另一臺服務器
export DOCKER_HOST="tcp://xx.xx.xx.xx:2375"       默認連接到遠程服務端
docker info            可以從這裏看到這時訪問到遠程服務端
export DOCKER_HOST=""            取消默認遠程客戶端

與宿主機進行地址映射與文件拷貝

docker run -d -v /data/volumes/ubuntu:/data --name ubuntu-nginx ubuntu:16.04 /bin/bash        將宿主機的/data/volumes/ubuntu 目錄映射到容器/data目錄
docker cp ubuntu-nginx:/a.txt a.txt             將容器內a.txt文件拷貝到宿主機
創建數據卷容器,並將數據卷容器掛載給其他容器
docker run -it -v /var/lib/mysql --name mysql-data ubuntu:16.04 /bin/bash           創建數據卷容器
docker run -it --volumes-from mysql-data --name mysql uetty/mysql:5.7.23 /bin/bash        掛載數據卷容器

其他操作命令一覽

docker ps                        查看各鏡像狀態(無參數:列出運行的容器,-a:列出所有的容器,-l:列出最後運行的容器)
docker exec -it 8d43 /bin/bash            容器中啓動新進程,異步方式進入docker容器命令行(如果容器構建使用的是/bin/sh,最後一個參數換成/bin/sh)
docker images            可看到uettydkr/test:1.0已進入現有鏡像列表中
docker attach 8d43           附加到docker容器,同步方式進入容器命令行(如果某個客戶端阻塞了,該方式進入也會被阻塞,因此不推薦)
docker inspect 8d43            列出容器json格式信息
ctrl+p && ctrl+q            退出交互式容器,容器不會停止運行(先後按下這兩個命令)
exit           對交互式容器會退出
docker logs 8d43            返回日誌(默認返回所有日誌,-f:持續返回日誌,-t:返回的日誌增加時間戳,--tail 10 指定顯示最新的10條日誌)
docker top 8d43            查看運行中容器的進程情況
docker info            查看docker信息,包括鏡像存儲位置
docker search java        從遠程鏡像倉庫查找鏡像
 

最後,自己的科學上網使用及搭建:
科學上網 - 1
科學上網 - 2
科學上網 - 3

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