DOCKER的安裝與學習

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刪除容器時報錯

刪除容器命令: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全清.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章