【docker】基礎知識,經常使用命令,平常使用足夠了

一、docker安裝

yum安裝並啓動程序html

[root@192 ~]# yum install docker  -y
[root@192 ~]# systemctl enable docker
[root@192 ~]# systemctl start docker

配置docker鏡像加速python

[root@192 ~]# cat /etc/docker/daemon.json 
{
  "registry-mirrors": ["https://qegs5iwg.mirror.aliyuncs.com"]
}
[root@192 ~]# systemctl restart docker

鏡像加速獲取方法:
登陸阿里雲——>產品——>容器服務ACK——>控制檯——>容器鏡像服務——>鏡像中心——>鏡像加速器,根據提示,完成鏡像加速配置(須要登陸註冊)
mysql

二、docker鏡像管理

在主機上查看當前鏡像linux

[root@192 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/ubuntu    latest              d70eaf7277ea        2 weeks ago         72.9 MB
docker.io/mysql     latest              db2b37ec6181        2 weeks ago         545 MB
docker.io/centos    latest              0d120b6ccaa8        2 months ago        215 MB
[root@192 ~]# docker images -q   //只查看鏡像的id
d70eaf7277ea
db2b37ec6181
0d120b6ccaa8

查找想要下載的鏡像,並下載nginx

[root@192 ~]# docker search all
[root@192 ~]# docker search centos
[root@192 ~]# docker pull docker.io/centos

查看鏡像詳情web

[root@192 ~]# docker image inspect $IMAGEID

修改鏡像名字和tag,等同於 複製某個鏡像,修更名字和標籤
鏡像的名字和標籤一塊兒用時中間加: 例如 docker.io/mysql:latest
sql

[root@192 ~]# docker tag $imageid mycentos_nginx:7   
[root@192 ~]#docker tag $REPOSITORY:TAG centos7:ok

刪除鏡像docker

# docker image rm daocloud.io/library/mysql      //使用鏡像名刪除
# docker rmi ed9c93747fe1                        //使用id刪除
# docker rmi docker.io/ubuntu:latest --force       //鏡像在使用中強制刪除
# docker rmi $(docker images -q)                    //刪除全部鏡像

若是鏡像正在被未運行的容器使用,則須要強制刪除,可是若是正在被運行的容器使用,則強制刪除也沒法刪除

查看鏡像製做過程,至關與dockerfile(後面說)shell

[root@192 ~]# docker image history library/centos
//本身作鏡像,可是作完的鏡像時間長了,咱們每每會忘記對鏡像作了什麼,故能夠查看鏡像的製做歷史。但每每咱們會經過dockerfile的方式作鏡像,簡單便捷,至關於腳本,腳本里就能看記錄,無需查看歷史。

三、docker容器管理

拉起docker容器數據庫

命令 動做 參數一、二、3… REPOSITORY shell命令
docker run -it docker.io/centos cat /etc/hosts
docker run -it --name mysql /bin/bash
[root@192 ~]# docker run -it  --name test docker.io/centos /bin/bash
[root@192 ~]# docker run -it -h $remote_ip/$remote_hostname docker.io/centos /bin/bash
參數詳解:
-i   捕獲標準輸入輸出,保持交互式的意思
-t   分配一個終端或控制檯,每個控制檯都要伴隨一個shell
-d 後臺運行容器,並返回ID
-m 設定容器使用的內存
/bin/bash   容器運行起來以後運行的程序,也能夠是任何的命令。
--name 給運行的容器命名
--dns-search: 指定容器主機所隸屬的域
--dns :指定 dns 服務器地址
--memory-swap 設定swap 
--cpuset-cpus="1,3" 限制容器使用的 vCPU 的 1 和 3 核心上
--blkio-weight 600 默認狀況下,全部容器能平等地讀寫磁盤 , 默認爲 500, 能夠提升權重爲 600
--device-read-bps ,限制讀某個設備的 bps 。
--device-write-bps ,限制寫某個設備的 bps 。
--device-read-iops ,限制讀某個設備的 iops 。
--device-write-iops ,限制寫某個設備的 iops
(bps 是 byte per second ,每秒讀寫的數據量,iops 是 io per second ,每秒 IO 的次數。)
--cidfile: 指定容器運行以後container長id的存放文件位置
--restart=always:默認狀況下docker重啓以後全部容器會被關閉,這個選項的意思是容器隨docker engine自啓動。
--rm   退出時就刪除該容器。默認狀況下,每一個容器在退出時,他的文件系統會保存下來。這樣一方面有利於調試,由於能夠經過查看日誌等方式來肯定最終狀態;另外一方面,也能夠保持容器所產生的數據。若是僅僅須要短暫的運行一個容器,且不須要保存容器中的數據,就能夠在exit容器時自動清理掉容器及其產生的數據。

退出容器

[root@432a76428d1d /]#^p^q  //退出容器繼續運行
[root@432a76428d1d /]# exit   //退出後,容器中止工做,拉起時加--restart=always參數的容器不會中止。

中止或啓動容器

[root@192 ~]# docekr stop 容器 ID
[root@192 ~]# docekr start 容器 ID
//run是將鏡像拉起成爲一個容器,未run過的容器,docker ps -a 是查不到,也就沒法經過docekr start 或者docker stop進行操做

查看容器的運行狀態

[root@192 ~]# docker ps //運行中的容器
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                  PORTS               NAMES
f3d143546f7a        docker.io/centos    "/bin/bash"         5 seconds ago       Up Less than a second                       serene_sammet
432a76428d1d        docker.io/centos    "/bin/bash"         11 minutes ago      Up 11 minutes                               loving_tesla

[root@192 ~]# docker ps -a //全部拉起的容器
[root@192 ~]# docker ps -a -q  //查看全部容器id
[root@192 ~]# docker ps -qf status=running    //查看某種狀態的容器id

登陸容器

[root@192 ~]# docker attach $CONTAINERID  
//回到run時的狀態,真正登陸到容器。執行exit會退出並中止容器。
[root@192 ~]# docker exec -it $CONTAINERID /bin/bash 
//exec調用docker命令。執行exit退出,不會中止容器,後面也能夠直接加命令
[root@192 ~]# docker exec -it f3 hostname
f3d143546f7a
[root@192 ~]# docker exec f3 hostname
f3d143546f7a

刪除容器

[root@192 ~]# docker rm $CONTAINERID
[root@192 ~]# docker rm -f $CONTAINERID    //強制刪除運行中的容器

查看容器信息/狀態

[root@192 ~]# docker info   //查看當前服務全部容器的信息
[root@192 ~]# docker stats $CONTAINERID //查看cpu、內存、磁盤IO等狀態
[root@192 ~]# docker inspect $CONTAINERID  //查看容器詳細配置信息,包含容器名、環境變量、運行命令、主機配置、網絡配置和數據卷配置等
[root@192 ~]# docker logs $CONTAINERID    //查看日誌
[root@192 ~]# docker top $CONTAINERID    //相似top
[root@192 ~]# docker diff $CONTAINERID  //查看容器內發生變化的文件,C對應的文件內容的改變,A對應的均是文件或者目錄的建立刪除
[root@192 ~]# docker events //實時輸出Docker服務器端的事件,包括容器的建立,啓動,關閉等。

四、docker建立自定義鏡像

拉起一個容器,部署想要的服務,而後再打包成鏡像,作到下次開箱即用
commit:提交容器到鏡像,實現容器持久化;
export:導出容器和鏡像,實現容器內容持久化;
save:導出鏡像文件,實現鏡像內容持久化。


4.一、export,把正在運行的容器直接導出爲tar包的鏡像文件

[root@192 ~]# docker export -o mysql_service.tar $CONTAINERID
[root@192 ~]# docker export $CONTAINERID > 315.tar

將鏡像導入至其餘服務器

[root@192 ~]# docker import 315.tar
[root@192 ~]# docker import 315.tar name:7   //導入就加入名字和標籤

4.二、save,直接把鏡像打包出來

[root@192 ~]# docker save -o suibian.tar $REPOSITORY:$TAG

將鏡像導入至其餘服務器

[root@192 ~]# docker load <  suibian.tar

4.三、commit,生成新的鏡像

docker commit [OPTIONS] CONTAINER [REPOSITORY:TAG]
docker 提交,生成新版本。 -m 添加註釋 /-a 做者/-p,–pause=true 提交時暫停容器運行 容器id/name 新的鏡像名稱
[root@192 ~]# docker commit -m "ownerimage" -a "centos" 315ed84d3304 hello:v1

以上三者的區別、額… 有大神會
https://zhuanlan.zhihu.com/p/152219012

4.四、dockerfile,生成新的鏡像(最經常使用)

能夠將命令行的操做放到配置文件中,使用配置文件建立鏡像。

  • 準備Dockerfile文件
[root@192 ~]# mkdir /dockerfiletest      //docker build須要指定此目錄名字
[root@192 ~]# cd /dockerfiletest
[root@192  dockerfiletest]# touch Dockerfile      //固定名字,加載時自動識別該名字
[root@192  dockerfiletest]# cat Dockerfile 
FROM daocloud.io/library/centos:6
MAINTAINER xingyao xingyao@localhost.localdomain
RUN touch /tmp/a.txt
RUN useradd xingyao
RUN echo 123 |passwd --stdin xingyao
##註釋:
FROM 基礎鏡像,存在直接使用,不存在自動下載
MAINTAINER 做者 做者郵箱
RUN 對鏡像作的後續改變 
RUN 繼續對鏡像作改變 
RUN ...
每行命令均是 INSTRUCTION statement形式,即命令+清單的模式。
命令要大寫
"#"是註解
能夠將多行放到一行,使用&& 鏈接

更加詳細的參數能夠參考大牛的連接
https://www.cnblogs.com/ling-yu-amen/p/10955361.html

  • 使用Dockerfile建立鏡像
[root@192  dockerfiletest]# docker build -t dockerfiletest:v1 . 
 -t:tag是標識新建的鏡像名
 "."是用來指明使用的Dockerfile文件當前目錄的,也可用絕對路徑 
由Dockerfile文件看出整個過程共5步,執行過程的詳細信息會顯示在終端
[root@192  dockerfiletest]# docker images
REPOSITORY                              TAG                 IMAGE ID            CREATED              SIZE
dockerfiletest                          v1                  69728f308204        About a minute ago   194 MB

五、docker容器與宿主機之間文件共享

5.一、docker與宿主機之間copy文件

容器mysql中/usr/local/bin/存在docker-entrypoint.sh文件,可以下方式copy到宿主機
[root@192 ~]#  docker cp $容器:/usr/local/bin/docker-entrypoint.sh   /root

將宿主機文件從新copy回容器
[root@192 ~]# docker cp /root/docker-entrypoint.sh $容器:/usr/local/bin/

5.二、docker容器卷

使用卷能夠將宿主機的文件共享到容器中,由於是共享關係,因此宿主機目錄和容器目錄中的數據是同步的。但不管是新卷仍是其餘容器共享的卷都只能應用給新容器,也就是在建立容器時使用卷

新卷只能在容器建立過程中掛載

[root@docker ~]# docker run -it -v /abc:/hello $容器
[root@docker ~]# touch /abc/abc.txt
[root@71fcb0382357 /]# ls /hello/
abc.txt
-v:指定宿主機上的一個路徑:容器中的路徑。全部目錄無需新建

實際應用中能夠利用多個-v選項把宿主機上的多個目錄同時共享給新建容器:

# docker run -it -v /abc:/abc -v /def:/def $容器

共享其餘容器的卷:
[root@docker ~]# docker attach 71
[root@71fcb0382357 /]# ls /hello/
abc.txt
[root@docker ~]# docker run -it --volumes-from $容器1 $容器2 /bin/bash
[root@9b0ca8808591 /]# ls /hello/
abc.txt





–volumes-from:表示將71fc容器中共享的目錄也共享給這個新的容器,71fc容器掛載到哪裏,新的容器就掛載到哪裏

六、Docker-Compose

6.一、docker-compose介紹

Docker-Compose 項目是 Docker 官方的開源項目,負責實現對 Docker 容器集羣的快速編排

  • Docker-Compose 將所管理的容器分爲三層 :
    工程( project )
    服務( service )
    容器( container )


  • Docker-Compose 運行目錄下的全部文件( docker-compose.yml , extends 文件或環境變量文件等)組成一個工程。
    若無特殊指定工程名即爲當前目錄名。
  • 一個工程當中可包含多個服務,每一個服務中定義了容器運行的鏡像,參數,依賴。
  • 一個服務當中可包括多個容器實例, Docker-Compose 並無解決負載均衡的問題,所以須要藉助其它工具實現服務發現及負載均衡。
  • Docker-Compose 的工程配置文件默認爲 docker-compose.yml ,可經過環境變量 COMPOSE_FILE或 -f 參數自定義配置文件,其定義了多個有依賴關係的服務及每一個服務運行的容器。
  • 使用一個 Dockerfile 模板文件,可讓用戶很方便的定義一個單獨的應用容器。在工做中,常常會碰到須要多個容器相互配合來完成某項任務的狀況。例如要實現一個 Web 項目,除了 Web 服務容器自己,每每還須要再加上後端的數據庫服務容器,甚至還包括負載均衡容器等。
  • Compose 容許用戶經過一個單獨的 docker-compose.yml 模板文件( YAML 格式)來定義一組相關聯的應用容器爲一個項目( project )。
  • Docker-Compose 項目由 Python 編寫,調用Docker 服務提供的 API 來對容器進行管理。所以,只要所操做的平臺支持 Docker API ,就能夠在其上利用 Compose 來進行編排管理。

6.二、 實現 Docker-Compose

  • 安裝 python2-pip 及 docker-compose
[root@192 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@192 ~]#  yum --enablerepo=epel -y install python2-pip
[root@192 ~]# pip install docker-compose
  • 編寫一個 DockerFile
[root@192 file]# cat Dockerfile 
FROM centos
MAINTAINER xingyao xingyao.com
RUN yum -y update
RUN yum -y install httpd
EXPOSE 80
CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]

爲何要docker運行apache要加FOREGROUND?
由於Docker容器僅在它的1號進程(PID爲1)運行時,會保持運行。若是1號進程退出了,Docker容器也就退出了。
參考:
https://www.cnblogs.com/cag2050/p/10144504.html


[root@192 file]# cat sshd 
FROM centos
MAINTAINER xingyao xingyao.com
RUN yum -y update
RUN yum -y install openssh-server
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
  • 實現 Docker-Compose
    制定一個應用配置
[root@192 file]# cat docker-compose.yml 
version: '3'
services:
  db:
    image: mariadb
    volumes:
      - /var/lib/docker/disk01:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_USER: centos
      MYSQL_PASSWORD: password
      MYSQL_DATABASE: centos_db
    ports:
      - "3306:3306"
  web:
    build: .
    ports:
      - "80:80"
    volumes:
      - /var/lib/docker/disk02:/var/www/html
  ssh:
    build:
      context: .
      dockerfile: sshd
    ports:
      - "2222:22"
  • 生成容器和鏡像
    關閉防火牆和selinux
[root@192 file]# docker-compose up -d
[root@192 file]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
f4096c00840b        file_web            "/usr/sbin/apachec..."   2 minutes ago       Up 2 minutes        0.0.0.0:80->80/tcp   file_web_1
[root@192 file]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
file_ssh            latest              8a6791c952d6        8 minutes ago       281 MB
file_web            latest              72bf0c7f6dbc        18 minutes ago      285 MB
  • 測試
# mysql -h 127.0.0.1 -u root -p -e "show variables like 'hostname';"
# mysql -h 127.0.0.1 -u centos -p -e "show databases;"
# echo "Hello xingyao" > /var/lib/docker/disk02/index.html
# curl localhost

6.三、 更多docker-compose操做

1) 顯示應用容器的狀態
# docker-compose ps
2) 顯示應用容器的 log
# docker-compose logs
3) 進入應用容器
# docker exec -it root_db_1 /bin/bash
6. docekr-compose 其餘操做
4) 中止應用容器
# docker-compose stop
5) 運行一個應用容器 , 若是有依賴的容器也將被
運行
# docker-compose up -d web
6) 刪除應用容器
# docker-compose rm

更多docker-compose學習能夠參考
http://www.javashuo.com/article/p-cpundiwy-bw.html

七、docker網絡類型

7.一、同主機通訊

7.1.一、bridge模式

  • 當 Docker 進程啓動時,會在主機上建立一個名爲 docker0 的虛擬網橋,此主機上啓動的 Docker容器會鏈接到這個虛擬網橋上。虛擬網橋的工做方式和物理交換機相似,這樣主機上的全部容器就經過交換機連在了一個二層網絡中
  • 從 docker0 子網中分配一個 IP 給容器使用,並設置 docker0 的 IP 地址爲容器的默認網關。在主機上建立一對虛擬網卡 veth pair 設備, Docker將 veth pair 設備的一端放在新建立的容器中,並命名爲 eth0 (容器的網卡),另外一端放在主機中,以 vethxxx 這樣相似的名字命名,並將這個網絡設備加入到 docker0 網橋中。能夠經過 brctl show 命令查看。
  • bridge 模式是 docker 的默認網絡模式,不寫 --net 參數,就是 bridge 模式。使用 docker run -p時, docker 實際是在 iptables 作了 DNAT 規則,實現端口轉發功能。可使用 iptables -t nat -vnL 查看。
# docker run -ti --net=bridge --name c7 centos /bin/bash

在這裏插入圖片描述

7.1.二、host模式

若是啓動容器的時候使用 host 模式,那麼這個容器將不會得到一個獨立的 Network Namespace ,而是和宿主機共用一個 Network Namespace 。容器將不會虛擬出本身的網卡,配置本身的 IP 等,而是使用宿主機的 IP 和端口。可是,容器的其餘方面,如文件系統、進程列表等仍是和宿主機隔離的。

# docker run -ti --net=host --name c7 myimages/centos-ip /bin/bash

在這裏插入圖片描述

7.1.三、Container 模式

這個模式指定新建立的容器和已經存在的一個容器共享一個 Network Namespace ,而不是和宿主機共享。新建立的容器不會建立本身的網卡,配置本身的 IP ,而是和一個指定的容器共享 IP 、端口範圍等。一樣,兩個容器除了網絡方面,其餘的如文件系統、進程列表等仍是隔離的。兩個容器的進程能夠經過 lo 網卡設備通訊。

# docker run -ti --net=bridge --name c7 myimages/centos-ip /bin/bash

在這裏插入圖片描述

7.1.四、None 模式

使用 none 模式, Docker 容器擁有本身的Network Namespace ,可是,並不爲 Docker 容器進行任何網絡配置。也就是說,這個 Docker 容器沒有網卡、 IP 、路由等信息。須要咱們本身爲Docker 容器添加網卡、配置 IP 等。

# docker run -ti --net=none --name c7 myimages/centos-ip /bin/bash

在這裏插入圖片描述

7.二、跨主機通訊

直接看各位大牛寫的吧、、太多了。

八、docekr私有倉庫

  • 環境準備
    client 192.168.135.161 #測試機
    docker 192.168.135.162 #私有庫

  • 實現步驟
    拉取作私有鏡像倉庫的鏡像:
[root@docker ~]# docker pull daocloud.io/library/registry
[root@docker ~]# docker images |grep regi
daocloud.io/library/registry   latest              b2b03e9146e1        3 months ago        33.3 MB
[root@docker ~]# docker run --restart=always -d -p 5000:5000 daocloud.io/library/registry   //端口轉發:解決容器端口訪問問題   135.161訪問-->宿主機135.162的5000端口--->容器的5000端口
93395acb90b8636453974921c9742837946b07e02d883f7157f373bdd2078e25
[root@docker ~]# docker ps
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                    NAMES
93395acb90b8        daocloud.io/library/registry   "/entrypoint.sh /e..."   5 minutes ago       Up 5 minutes        0.0.0.0:5000->5000/tcp   naughty_goldwasser

進入到私有倉庫容器中去

[root@docker ~]# docker exec -it 9339 /bin/sh       //這裏是sh,不是bash,無軟鏈接
/ # netstat -lnp |grep :5000
tcp        0      0 :::5000                 :::*                    LISTEN      1/registry
/ #

訪問私有倉庫

[root@docker ~]# curl -I 127.0.0.1:5000         //查看狀態碼爲200
HTTP/1.1 200 OK
Cache-Control: no-cache
Date: Sun, 21 Oct 2018 07:36:11 GMT
Content-Type: text/plain; charset=utf-8

下載小鏡像buysbox上傳到私有庫

[root@client ~]# docker pull busybox
[root@client ~]# docker tag busybox 192.168.135.162:5000/busybox    //宿主機ip

[root@client ~]# docker push 192.168.135.162:5000/busybox
The push refers to a repository [192.168.135.162:5000/busybox]
Get https://192.168.135.162:5000/v1/_ping: http: server gave HTTP response to HTTPS client

如上顯示因爲客戶端採用https,docker registry未採用https服務致使未上傳成功"192.168.1.100:5000"請求改成http。

解決方法:

[root@client ~]# touch /etc/docker/daemon.json
[root@client ~]# vim /etc/docker/daemon.json
{ "insecure-registries":["192.168.135.162:5000"] }

[root@client ~]# systemctl restart docker

[root@client ~]# docker push  192.168.135.162:5000/busybox
The push refers to a repository [192.168.135.162:5000/busybox]
8a788232037e: Pushed 
latest: digest: sha256:915f390a8912e16d4beb8689720a17348f3f6d1a7b659697df850ab625ea29d5 size: 527

查看私有倉庫裏的全部鏡像

[root@client-161 ~]# curl  192.168.135.162:5000/v2/_catalog
{"repositories":["busybox"]}

查看更詳細的鏡像信息:

[root@client-161 ~]# curl  http://192.168.135.162:5000/v2/busybox/tags/list

客戶端使用私有倉庫的鏡像

[root@client-161 ~]# docker pull 192.168.135.162:5000/busybox
Using default tag: latest
Trying to pull repository 192.168.135.162:5000/busybox ... 
latest: Pulling from 192.168.135.162:5000/busybox
90e01955edcd: Pull complete 
Digest: sha256:915f390a8912e16d4beb8689720a17348f3f6d1a7b659697df850ab625ea29d5
Status: Downloaded newer image for 192.168.135.162:5000/busybox:latest
[root@client-161 ~]# docker images |grep busy
192.168.135.162:5000/busybox   latest              59788edf1f3e        2 weeks ago         1.15 MB
相關文章
相關標籤/搜索