DOCKER的安裝與學習
環境信息
centos7.2
學習目錄
DOCKER安裝
docker設置固定ip地址
docker動態設置端口映射
DOCKER安裝
1. 安裝前工作
檢查內核版本(uname -r),docker要求需要大於3.10纔可以
本次安裝的操作系統是centos7
2. 安裝DOCKER步驟
獲取rpmdocker文件
下載docker的rpm文件中轉站
yum https://get.docker.com/rpm/1.7.1/centos-6/RPMS/x86_64/docker-engine-1.7.1-1.el6.x86_64.rpm
md5校驗文件(可忽略)
md5sum https://get.docker.com/rpm/1.7.1/centos-6/RPMS/x86_64/docker-engine-1.7.1-1.el6.x86_64.rpm ##md5校驗
安裝docker
rpm -ivh docker-engine-1.7.1-1.el6.x86_64.rpm
yum -y install docker-engine
#鏡像加速器
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://95822026.m.daocloud.io
如果docker啓動報錯可修改文件daemon.json(/etc/docker/daemon.json)爲以下重試:
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
設置docker爲自啓動
systemctl enable docker#設置開機啓動
systemctl disable docker#關閉開機啓動
重啓docker服務
service docker restart [start, stop, restart, try-restart, reload, force-reload, status] #後面的都是可選項
docker常用命令
docker pull centos:7 #獲取鏡像文件centos:tag爲7
docker version #獲取docker版本信息
docker search centos #獲取centos鏡像信息
docker --help #獲取docker命令幫助信息
docker images #獲取docker已經安裝的鏡像列表
docker ps -a/docker ps -n 5 #獲取docker創建的容器信息,前者是查看全部,後者是查看前五個
docker run -tid --name tomcat01 ec1acc17f809 /usr/sbin/init #根據一個鏡像常見一個操作系統-根據鏡像名稱ec1acc17f809創建系統名爲tomcat01的系統(容器)(固定命令)
docker exec -it tomcat01 /bin/bash #進入一個docker的容器(系統)(固定命令)
docker rm tomcat01 #刪除容器(系統)名稱爲tomcat01的容器
docker rmi ec1acc17f809 或者 docker rmi docker.io/centos:7 #刪除鏡像id爲ec1acc17f809 的容器(或者存在重名,重鏡像id的時候,採用倉庫名稱加冒號加tag信息進行刪除)
docker start mysql #啓動容器(系統名稱爲mysql)
docker commit -m "提交爲鏡像的描述(類似git提交代碼的描述)" -a "作者信息" 容器ID(可以簡寫) 鏡像名稱 #將容器做成鏡像(-m 提示信息 -a 作者 )
docker save -o mysql-and-loadbalance-image.tar 318c2bf36d1f 將鏡像打包成一個tar包(-o輸出到一個文件,mysql-and-loadbalance-image.tar自己起的tar包文件名,318c2bf36d1f鏡像id)
docker load -i /opt/soft_bak/mysql-and-loadbalance-image.tar 將鏡像tar文件,copy到另一臺主機進行載入
docker tag 3e7767ddd728 geektown/mysql-and-loadbalance-image 導入後未命名,通過tag命令打上標記。
docker inspect 7187b75620b4 |grep IPAddress 查看docker的容器的ip地址(7187b75620b4爲容器id)
docker port 44de1b0b5312(容器ID) 查看容器綁定和映射的端口及Ip地址
$ docker run -d -p 5005:5000 -p 5006:80 #容器ID:44e703c1279a 容器啓動綁定多IP
殺死所有正在運行的容器: docker kill $(docker ps -a -q)
刪除所有停止的容器: docker rm $(docker ps -a -q)
docker從容器裏面拷文件到宿主機或從宿主機拷文件到docker容器裏面
1、從容器裏面拷文件到宿主機?
答:在宿主機裏面執行以下命令
docker cp 容器名:要拷貝的文件在容器裏面的路徑 要拷貝到宿主機的相應路徑
示例: 假設容器名爲testtomcat,要從容器裏面拷貝的文件路爲:/usr/local/tomcat/webapps/test/js/test.js, 現在要將test.js從容器裏面拷到宿主機的/opt路徑下面,那麼命令應該怎麼寫呢?
答案:在宿主機上面執行命令
docker cp testtomcat:/usr/local/tomcat/webapps/test/js/test.js /opt
2、從宿主機拷文件到容器裏面
答:在宿主機裏面執行如下命令
docker cp 要拷貝的文件路徑 容器名:要拷貝到容器裏面對應的路徑
示例:假設容器名爲testtomcat,現在要將宿主機/opt/test.js文件拷貝到容器裏面的/usr/local/tomcat/webapps/test/js路徑下面,那麼命令該怎麼寫呢?
答案:在宿主機上面執行如下命令
docker cp /opt/test.js testtomcat:/usr/local/tomcat/webapps/test/js
docker重啓容器的環境配置失效
我通過命令docker exec -ti ID /bin/bash進入容器時,發現原來配置在/etc/profile中的環境變量(jre)失效,每次重啓都需要執行source /etc/profile纔可以重新有效,這樣該怎麼處理比較好?
我採用的是把變量寫入/root/.bashrc這個文件,就會自動讀取你的變量了.
指定多個端口映射,容器指定固定ip在創建容器的時候
意思是將宿主機的3306(前)端口映射到宿主機的3306端口和容器的3306端口(後),將宿主機的8084(前)端口映射到容器的8084端口(後),創建一個名稱爲mysql-master-temp的容器,使用自定義的網段staticnet,指定ip地址192.168.0.6,使用鏡像mysql-master-images
docker run -it -d -p 127.0.0.1:3306:3306 -p 8084:8084 --name mysql-master-temp --network staticnet --ip 192.168.0.6 mysql-master-images /usr/sbin/init
刪除容器命令:docker rm mysql-master
出現錯誤:Error response from daemon: Driver overlay2 failed to remove root filesystem 7187b75620b4fa53f5bdaf4e50de0c7e9a152a261c7da1494139a50a7f65db74: remove /var/lib/docker/overlay2/4a029deaed28e83f817b500464ff9c829d44139b393e70e914f46c5a68d00e9b/merged: device or resource busy
解決方案:【7187b75620b4fa53f5bdaf4e50de0c7e9a152a261c7da1494139a50a7f65db74是上面的錯誤的信息】
[root@kunzai ~]# grep docker /proc/*/mountinfo | grep 7187b75620b4fa53f5bdaf4e50de0c7e9a152a261c7da1494139a50a7f65db74 | awk -F':' '{print $1}' | awk -F'/' '{print $3}'
24704
24705
將進程殺死
[root@kunzai ~]# kill -9 24704
[root@kunzai ~]# kill -9 24705
重新刪除可以了
[root@kunzai ~]# docker rm mysql-master
mysql-master
docker容器與宿主機的時間不一致的問題
情況在現
[root@1006130733e6 boot]# date
Sat May 11 05:58:53 UTC 2019
[root@kunzai zookeeperColony]# date
Sat May 11 13:58:56 CST 2019
解決
1. 共享主機的localtime (方法一)
創建容器的時候指定啓動參數,掛載localtime文件到容器內 ,保證兩者所採用的時區是一致的。
docker run -d -v /etc/localtime:/etc/localtime --rm -p 8888:8080 tomcat:latest
2. 複製主機的localtime (方法二)
docker cp /etc/localtime 容器名稱或id:/etc/
在完成後,再通過date命令進行查看當前時間。
- 但是,在容器中運行的程序的時間不一定能更新過來,比如在容器運行的MySQL服務,在更新時間後,通過sql查看MySQL的時間
select now() from dual;
可以發現,時間並沒有更改過來。
這時候必須要重啓mysql服務或者重啓Docker容器,mysql才能讀取到更改過後的時間。
docker開放2375端口
編輯docker文件:/usr/lib/systemd/system/docker.service
vim /usr/lib/systemd/system/docker.service
修改ExecStart行爲下面內容
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock \
快速安裝
yum update
yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
使用ali鏡像下載安裝
安裝依賴包
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
重建 Yum 緩存。
安裝 Docker-CE ,請執行一下命令進行安裝:
sudo yum install docker-ce
4.啓動 Docker-CE
sudo systemctl enable docker
sudo systemctl start docker
總結
①:docker類似git
docker設置固定ip地址
1. 配置前工作
docker啓動的容器指定一個固定ip,我們知道默認情況下,docker會使用bridge網絡模式爲每一個啓動的容器動態分配一個IP,以172.17.0.1爲網關,172.17.0.2,172.17.0.3依次類推作爲容器的ip,這樣也算是每個容器有了ip,當下次啓動多個容器的時候IP還是會按照這種方式分配,表面上還是一個固定IP的方式,但是這種方式對容器啓動順序有嚴格的要求。還有一種方式就是通過人爲指定IP的方式
啓動容器時可以通過–net=none指定容器網絡模式。有四種網絡模式可以選擇:host,container,none,bridge(默認),如果不設置這個參數,那麼默認就是bridge的模式,採用dhcp的方式分配IP
2. docker設置固定ip地址步驟
Docker安裝後,默認會創建下面三種網絡類型
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
9781b1f585ae bridge bridge local
1252da701e55 host host local
237ea3d5cfbf none null local
啓動 Docker的時候,用 --network 參數,可以指定網絡類型
docker run -itd --name test1 --network bridge --ip 172.17.0.10 centos:latest /bin/bash
- bridge:橋接網絡
默認情況下啓動的Docker容器,都是使用 bridge,Docker安裝時創建的橋接網絡,每次Docker容器重啓時,會按照順序獲取對應的IP地址,這個就導致重啓下,Docker的IP地址就變了 - none:無指定網絡
使用 --network=none ,docker 容器就不會分配局域網的IP - host: 主機網絡
使用 --network=host,此時,Docker 容器的網絡會附屬在主機上,兩者是互通的。
例如,在容器中運行一個Web服務,監聽8080端口,則主機的8080端口就會自動映射到容器中。 - 創建自定義網絡:(設置固定IP)
啓動Docker容器的時候,使用默認的網絡是不支持指派固定IP的,如下
docker run -itd --net bridge --ip 172.17.0.10 centos:latest /bin/bash
6eb1f228cf308d1c60db30093c126acbfd0cb21d76cb448c678bab0f1a7c0df6
docker: Error response from daemon: User specified IP address is supported on user defined networks only.
- 步驟1: 創建自定義網絡
docker network create --subnet=172.18.0.0/16 mynetwork
➜ ~ docker network ls
NETWORK ID NAME DRIVER SCOPE
9781b1f585ae bridge bridge local
1252da701e55 host host local
4f11ae9c85de mynetwork bridge local
237ea3d5cfbf none null local
- 步驟2: 創建Docker容器
docker run -itd --name networkTest1 --net mynetwork --ip 172.18.0.2 centos:latest /bin/bash
如: 創建一個名爲mysql-test的容器,使用上面創建的網段staticnet,指定ip地址192.168.0.6,依據鏡像文件my-mysql進行創建
docker run -it --name mysql-test --network staticnet --ip 192.168.0.6 my-mysql /usr/bin/bash
docker動態設置端口映射
查看Container的IP地址
docker inspect <container name or id>| grep IPAddress
查看Container的映射的端口
docker port <container name or id>
如.
docker port d8dac7399647
docker port hfq-jedi-zxf-eden
用iptables查看容器映射情況
iptables -t nat -nvL
iptables -t nat -nvL --line-number
舉例新增端口的映射
##將主機31101 映射到 容器 6379端口
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 31101 -j DNAT --to-destination 192.168.42.2:6379
保存iptables規則
iptables-save
說明
192.168.42.2 是根據 docker inspect <container name or id>| grep IPAddress 的結果
端口映射完畢後,不能通過docker port d8dac7399647查詢到結果
可以通過
iptables -t nat -nvL | grep 192.168.42.2
查詢 映射關係
如果不行也可使用下面的方法一
DOCKER 給運行中的容器添加映射端口
方法1
1、獲得容器IP
將container_name 換成實際環境中的容器名
docker inspect `container_name` | grep IPAddress
2、 iptable轉發端口
將容器的8000端口映射到docker主機的8001端口
iptables -t nat -A DOCKER -p tcp --dport 8001 -j DNAT --to-destination 172.17.0.19:8000
方法2
1.提交一個運行中的容器爲鏡像
docker commit containerid foo/live
2.運行鏡像並添加端口
docker run -d -p 8000:80 foo/live /bin/bash
而我是使用的是以下方法
將容器的192.168.0.2的端口爲6379映射到主機的31101端口上
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 31101 -j DNAT --to-destination 192.168.0.2:6379
iptables -t nat -A DOCKER -p tcp --dport 8001 -j DNAT --to-destination 172.17.0.19:8000
iptables-save
可以通過下面查詢 映射關係
iptables -t nat -nvL | grep 192.168.0.2【容器ip】
如果添加錯了我是使用下面的方式刪除的
使用以下命令查詢規則
[root@kunzai ~]# iptables -t nat -nvL --line-number
Chain PREROUTING (policy ACCEPT 1226 packets, 52912 bytes)
num pkts bytes target prot opt in out source destination
1 147 7552 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:15672 to:192.168.0.2:15672
2 62 3176 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:15673 to:192.168.0.3:15672
3 6 320 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:5672 to:192.168.0.2:5672
4 1 40 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:5673 to:192.168.0.3:5673
5 0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:5673 to:192.168.0.3:5672
6 93669 3448K DOCKER all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
7 0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8085 to:192.168.0.2:8084
刪除一條nat 規則
iptables -t nat -D PREROUTING(這個可以選擇) 4(這個是數字,就是num下面的數據)
查詢指定容器的端口映射
iptables -t nat -nvL | grep 192.168.42.2
linux的知識
- There are unfinished transactions remaining解決方法
# 清除yum緩存
yum clean all
# 運行 yum-complete-transaction,清理未完成事務
yum-complete-transaction --cleanup-only
yum會把下載的軟件包和header存儲在cache中,而不會自動刪除.可用yum clean headers清除header,yum clean packages清除下載的rpm包,yum clean all全清.