Linux-Docker-1-基礎

什麼是Docker?

官網:https://www.docker.com/html

開源:https://github.com/dockermysql

Docker是一個開源的應用容器引擎,支持將軟件編譯成一個鏡像,而後在鏡像中各類作好配置,將鏡像發佈出去,其它使用者直接使用這個鏡像。容器啓動是很是訊速的。相似windows裏面的ghost操做系統,安裝好後什麼都有了。linux

Docker核心概念

Docker核心概念:nginx

  • docker主機(Host):一個物理或虛擬的機器用於執行Docker守護進程和容器(安裝了Docker程序的機器,能夠是Linux或windows)
  • docker客戶端(Client):客戶端經過命令或其它工具使用Docker API()與Docker的守護進程通訊
  • docker倉庫(Registry):用來保存打包好的鏡像,能夠理解爲代碼控制中的代碼倉庫。Docker Hub(https://hub.docker.com)提供了龐大的鏡像集合供使用。
  • docker鏡像(Images):用於建立Docker容器的模板
  • docker容器(Container):鏡像啓動後的實例稱爲一個容器;容器是一個獨立運行的一個或一組應用

Docker使用步驟:git

1)安裝Dockergithub

2)去Docker倉庫找到這個軟件對應的鏡像redis

3)使用Docker運行這個鏡像,這個鏡像就會生成一個Docker容器sql

4)對容器的啓動中止就是對軟件的啓動中止docker

安裝Docker(Linux)

1)環境:CentOS七、shell

Docker要求CentOS內核版本高於3.10,若是版本太低,能夠用yum update升級內核版本

2)安裝

yum update #更新內核到3.10以上

yum install docker

systemctl start docker #啓動docker

systemctl enable/disable docker #設爲/關閉開機啓動

systemctl stop docker #中止docker

啓動失敗

解決辦法:vim /etc/sysconfig/docker,設置--selinux-enabled=false

參考了:https://blog.csdn.net/kavito/article/details/81200665

總結:將centos7的內核升級至最新後再安裝docker能夠減小不少錯誤,另外還須要禁用sell linux。

[root@eureka1 test]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

安裝Docker(Windows)

Docker Desktop requires Windows 10 Pro or Enterprise version 14393 to run.

經常使用操做

1、鏡像操做

操做 命令 說明
檢索 docker search xxx,如:docker search redis 檢索鏡像,做用不大,還不如到官網上檢索 https://hub.docker.com/
拉取 docker pull 鏡像名:tag :tag是可選的,tag表示標籤,多爲軟件版本,默認爲latest
列表 docker images 查看全部本地鏡像
刪除 docker rmi image-id 刪除指定的本地鏡像
清理鏡像 docker image prune 清除一些遺留的臨時鏡像,釋放空間
- docker commit -m="提交的描述信息" -a="做者" 容器ID 要建立的目標鏡像名:[TAG] 提交容器副本使之成爲一個新的鏡像

示例:

搜索鏡像

[root@localhost test]# docker search mysql
INDEX       NAME                                        DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/mysql                             MySQL is a widely used, open-source relati...   8345      [OK]       
docker.io   docker.io/mariadb                           MariaDB is a community-developed fork of M...   2860      [OK]       
docker.io   docker.io/mysql/mysql-server                Optimized MySQL Server Docker images. Crea...   623                  [OK]
docker.io   docker.io/percona                           Percona Server is a fork of the MySQL rela...   438       [OK]       
docker.io   docker.io/centurylink/mysql                 Image containing mysql. Optimized to be li...   60                   [OK]
docker.io   docker.io/centos/mysql-57-centos7           MySQL 5.7 SQL database server                   57                   
docker.io   docker.io/mysql/mysql-cluster               Experimental MySQL Cluster Docker images. ...   45

下載鏡像

[root@localhost test]# docker pull mysql:5.5
...

怎麼知道有哪些可用的tag?官網上搜索會提示有哪些可用的tags https://hub.docker.com/


解決鏡像下載慢的問題:

1)登陸阿里雲 https://www.aliyun.com/ ,查看鏡像加速地址,如:https://chohcg90.mirror.aliyuncs.com

2)vim /etc/docker/daemon.json,修改以下:

{
"registry-mirrors": ["https://chohcg90.mirror.aliyuncs.com"]
}

參考:https://www.cnblogs.com/kevin7234/p/10617734.html


將鏡像提交到阿里雲

1)登陸阿里雲,建立鏡像倉庫

2)本地上傳鏡像到剛剛建立的鏡像倉庫

建立鏡像倉庫後,上面有文檔參考

2、容器操做

軟件鏡像(QQ安裝程序)---》運行鏡像---》產生一個容器(正在運行的QQ)

操做 命令 說明
運行 docker run --name container-name -d image-name <br> 如:docker run -name myredis -d redis --name:自定義容器名 <br> -d:後臺運行 <br> image-name:指定鏡像模板
列表 docker ps(查看運行中的容器) docker ps -a 能夠查看全部容器
中止 docker stop/kill container-name/container-id 中止當前運行的容器
啓動 docker start/restart container-name/container-id 啓動容器
刪除 docker rm container-id <br> docker rm -f $(docker ps -q) 刪除所有在運行的容器 <br> docker rm -f $(docker ps -a -q) 刪除全部容器 刪除指定的容器
端口映射 -p 6379:6379 <br> 如:docker run -d -p 6379:6379 --name myredis redis -p:主機端口(映射到)容器內部的端口
容器日誌 docker logs container-name/container-id [OPTIONS] -t 加入時間戳 <br> -f 跟隨最新的日誌打印 <br> --tail x(x是數字) 顯示最後多少行
查看容器內運行的進程 docker top 容器id
查看容器內部細節 docker inspect 容器id 查看容器的內部細節,包括IP、網橋
進入正在運行的容器 <br> 並以命令行交互 docker exec -it 容器ID bashShell <br> docker container exec -it nginx1 /bin/bash <br> docker attach 容器ID 區別:<br> attach 直接以命令交互方式進入容器 <br> exec 不用進入容器卻能執行容器的命令
從容器拷貝文件到主機上 docker cp 容器ID:容器內路徑 目標主機路徑
更多命令

容器啓動命令 docker run,格式:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

OPTIONS,有些是一個減號,有些是兩個減號

  • --name = "給容器起個名字"

  • -d 後臺運行,並返回容器ID

  • -i 以交互模式運行容器,一般與 -t 同時使用

  • -t 爲容器從新分配一個僞輸入終端,一般與 -i 同時使用

  • -P 隨機端口映射

  • -p 指定端口映射

    • ip:hostPort:containerPort
    • ip::containerPort
    • hostPort:containerPort,這個經常使用
    • containerPort

例如在docker上啓動ctntos

docker run -it 9f38484d220f

退出centos

  • exit,徹底退出並關閉容器
  • 快捷鍵:ctrl + P + Q,暫時退出但不關閉容器

從新進入centos

  • 方式一:
docker exec -t 容器ID /bin/bash
  • 方式二:
docker attach 容器ID

docker exec -t 容器ID ls -l /tmp能夠直接執行容器中的命令而不用進入容器中的命令行界面,「隔山打牛」。


docker ps [OPTIONS]

  • -a 全部歷史記錄的容器
  • -l 上一次打開的容器
  • -n x(x是數字),最近打開過的x個容器
  • -q 查出正在運行的容器ID,批量刪除容器:docker rm -f $(docker ps -q) ——20190704

文件拷貝

  • 從宿主機拷貝文件到容器中:docker cp 須要拷貝的文件或目錄 容器名稱:容器目錄
  • 從容器拷貝文件到宿主機中:docker cp 容器名稱:容器目錄 宿主機目錄

目錄掛載

-v 參數

目錄掛載是爲了方便在宿主機編輯文件,而後會同步到容器上,程序運行,最終是按容器中的目錄

鏡像原理

這是金魚背上的一個集裝箱

相關概念:

  • UnionFS(聯合文件系統)
  • bootfs,
  • rootfs,在bootfs之上,包含的就是典型的Linux中的/dev,/proc,/bin,/etc等標準目錄和文件,rootfs就是各類不一樣的操做系統發行版本,如ubuntu、centos。

數據卷

數據卷:對容器數據的持久化,持久化到主機上,容器與主機之間的數據共享。

-v 參數

命令:

docker run -it -v /宿主機絕對路徑目錄:/容器內目錄 鏡像名或id

命令(帶權限)

docker run -it -v /宿主機絕對路徑目錄:/容器內目錄:ro 鏡像名或id
  • 默認是可讀可寫
  • :ro 只讀,容器只能讀,主機可讀可寫

總結:-v除了目錄映射外,還能夠文件映射,即:-v /宿主機絕對路徑文件:/容器內的文件,如nginx.conf ——20191121

DockerFile

1)在主機根目錄下新建mydocker目錄並進入

# cd /
# mkdir /mydocker
# cd /mydocker/

2)在Dockerfile中使用 VOLUME 指令來給鏡像添加一個或多個數據卷

# vim DockerFile

內容以下:

FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,-----------success1"
CMD /bin/bash

3)build生成新的鏡像

# docker build -f /mydocker/DockerFile -t zzyy/centos .

4)運行剛剛生成的容器容器

# docker run -it zzyy/centos

在根目錄下能夠看到多個兩個卷

5)備註

若是出現容器卷不能寫,出現cannot open directory:Permission denied

解決辦法:在掛載目錄後多加一個 --privileged=true 參數

容器數據卷

是什麼

命名的容器掛載數據卷,其它容器經過容器經過掛載這個(父容器)實現數據共享,掛載數據卷的容器稱之爲數據卷容器。

一句話:活動硬盤上掛活動硬盤,實現數據的傳遞依賴。

數據共享

上面已經建立了一個 zzyy/centos 鏡像,而且有了兩個數據卷 dataVolumeContainer一、dataVolumeContainer2

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
zzyy/centos         latest              e8c61129663a        9 hours ago         202 MB
...

[root@localhost ~]# docker run -it --name dc01 zzyy/centos
[root@3da5bea8d5d8 /]# ll
total 12
-rw-r--r--.   1 root root 12082 Mar  5 17:36 anaconda-post.log
lrwxrwxrwx.   1 root root     7 Mar  5 17:34 bin -> usr/bin
drwxr-xr-x.   2 root root     6 Jul  4 16:19 dataVolumeContainer1
drwxr-xr-x.   2 root root     6 Jul  4 16:19 dataVolumeContainer2
drwxr-xr-x.   5 root root   360 Jul  4 16:19 dev
drwxr-xr-x.   1 root root    66 Jul  4 16:19 etc
...
[root@3da5bea8d5d8 /]# cd dataVolumeContainer2/                     // 在這個容器的這個目錄,建立一個文件
[root@3da5bea8d5d8 dataVolumeContainer2]# touch dc01_add.txt

ctrl + p + q

[root@localhost ~]# docker run -it --name dc02 --volumes-from dc01 zzyy/centos
[root@61be3fe9262b /]# ll
total 12
-rw-r--r--.   1 root root 12082 Mar  5 17:36 anaconda-post.log
lrwxrwxrwx.   1 root root     7 Mar  5 17:34 bin -> usr/bin
drwxr-xr-x.   2 root root     6 Jul  4 16:19 dataVolumeContainer1
drwxr-xr-x.   2 root root    26 Jul  4 16:20 dataVolumeContainer2
drwxr-xr-x.   5 root root   360 Jul  4 16:28 dev
...
[root@61be3fe9262b /]# cd dataVolumeContainer2
[root@61be3fe9262b dataVolumeContainer2]# ll
total 0
-rw-r--r--. 1 root root 0 Jul  4 16:20 dc01_add.txt                 // 這個文件是從 dc01容器繼承過來的
[root@61be3fe9262b dataVolumeContainer2]# 
[root@61be3fe9262b dataVolumeContainer2]# touch dc02_add.txt

ctrl + p + q

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
61be3fe9262b        zzyy/centos         "/bin/sh -c /bin/bash"   11 minutes ago      Up 11 minutes                           dc02
3da5bea8d5d8        zzyy/centos         "/bin/sh -c /bin/bash"   19 minutes ago      Up 19 minutes                           dc01

[root@localhost ~]# docker run -it --name dc03 --volumes-from dc01 zzyy/centos
[root@d541e9e3b6a2 /]# cd dataVolumeContainer2
[root@d541e9e3b6a2 dataVolumeContainer2]# ll
total 0
-rw-r--r--. 1 root root 0 Jul  4 16:20 dc01_add.txt
-rw-r--r--. 1 root root 0 Jul  4 16:38 dc02_add.txt                 // 也有前兩個容器的文件
[root@d541e9e3b6a2 dataVolumeContainer2]# 
[root@d541e9e3b6a2 dataVolumeContainer2]# touch dc03_add.txt

ctrl + p + q

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
d541e9e3b6a2        zzyy/centos         "/bin/sh -c /bin/bash"   5 minutes ago       Up 5 minutes                            dc03
61be3fe9262b        zzyy/centos         "/bin/sh -c /bin/bash"   19 minutes ago      Up 19 minutes                           dc02
3da5bea8d5d8        zzyy/centos         "/bin/sh -c /bin/bash"   28 minutes ago      Up 28 minutes                           dc01
[root@localhost ~]# docker attach dc01
[root@3da5bea8d5d8 dataVolumeContainer2]# ll
total 0
-rw-r--r--. 1 root root 0 Jul  4 16:20 dc01_add.txt
-rw-r--r--. 1 root root 0 Jul  4 16:38 dc02_add.txt
-rw-r--r--. 1 root root 0 Jul  4 16:47 dc03_add.txt                 // dc01容器有子容器添加的文件
[root@3da5bea8d5d8 dataVolumeContainer2]#

整理:dc0二、dc03的父類都是dc01,子到父,父到子均可以傳遞文件。

若是此時將父容器dc01刪掉,dc02和dc03之間數據仍是共享的,也就是文件是共享的,數據卷的生命週期一直持續到沒有容器使用它爲止。

DockerFile

是什麼

Dockerfile是用來構建Docker鏡像的構建文件,是由一系列命令、參數構成的腳本。

三個步驟

1)編寫DockerFile文件

2)docker build

3)docker run

文件長什麼樣子的?以centos6.8爲例

FROM scratch
MAINTAINER The CentOS Project <cloud-ops@centos.org>
ADD c68-docker.tar.xz /
LABEL name="CentOS Base Image" \
    vendor="CentOS" \
    license="GPLv2" \
    build-date="2016-06-02"

# Default command
CMD ["/bin/bash"]

構建過程解析

DockerFile內容基礎知識:

  • 每條保留字指令都必須爲大寫字母且後面跟隨至少一個參數
  • 指令按照從上到下順序執行
  • #表示註解
  • 每條指令都會建立一個新的鏡像層,並對鏡像進行提交

執行大體流程

  1. 從基礎鏡像運行一個容器
  2. 執行一條指令並對容器做出修改
  3. 執行 docker commit 提交一個新的鏡像層
  4. 基於剛剛提交的鏡像運行一個新的容器
  5. 執行下一條指令直至全部指令都執行完成

體系結構(保留字指令)

  • FROM
  • MAINTAINER
  • RUN
  • EXPOSE
  • WORKDIR
  • ENV
  • ADD
  • COPY
  • VOLUME
  • CMD
  • ENTRYPOINT
  • ONBUILD

解釋

  • FROM,基礎鏡像,當前鏡像是基於哪一個鏡像的
  • MAINTAINER,鏡像維護者的姓名、郵箱
  • RUN,容器構建時須要執行的命令
  • EXPOSE,當前容器對外暴露的端口
  • WORKDIR,指定在容器建立後,終端默認登陸進來的工做目錄,落腳點
  • ENV,用來在構建鏡像過程當中設置環境變量,定義變量後,後面的指令就可使用$來獲取定義的變量
ENV MY_PATH /usr/mytest
...
WORKDIR $MY_PATH
  • ADD,將宿主機目錄下的文件拷貝進鏡像且ADD命令會自動處理URL和解壓tar壓縮包
  • COPY,相似ADD,只是拷貝,從<源路徑>拷貝到<目標路徑>
    • COPY src dest
    • COPY ["src","dest"]
  • VOLUME,容器數據卷,用於數據保存、待久化,VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
  • CMD,指定一個容器啓動時運行的命令,能夠有多個CMD命令,但只有最後一個生效,CMD會被 docker run 以後的參數替換
  • ENTRYPOINT,指定一個容器啓動時運行的命令,跟CMD同樣,都是在指定容器啓動程序及參數,區別是:CMD命令可能被替換,而ENTRYPOINT能夠追加命令
  • ONBUILD,在構建一個被繼承的DockerFile時運行命令,父鏡像在被子繼承後交鏡像的onbuild被觸發

案例

自定義mycentos

讓精簡版的centos具備如下功能:

  1. 登陸後的默認路徑
  2. vim編輯器
  3. 支持ifconfig查看網絡

步驟:

1)在宿主機根目錄下的mydocker目錄下建立一個DockerFile

cd /
cd /mydocker
vim DockerFile2

內容以下:

FROM centos
MAINTAINER zzyy<zzyy167@126.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "success......ok"
CMD /bin/bash

2)構建

docker build -f /mydocker/DockerFile2 -t mycentos:1.3 .

注意:最後有個點.表明當前路徑

3)運行

docker run -it mycentos:1.3

默認進入 /usr/local 目錄,也能使用 vim/ifconfig 命令了

4)列出鏡像變動歷史

docker history 鏡像ID

docker history 8911244c3084

FAQ

Docker容器開機自動啓動

在使用docker run啓動容器時,使用--restart參數來設置:

# docker run -m 512m --memory-swap 1G -it -p 58080:8080 --restart=always --name bvrfis --volumes-from logdata mytomcat:4.0 /root/run.sh

--restart具體參數值詳細信息:

  • no - 容器退出時,不重啓容器;
  • on-failure - 只有在非0狀態退出時才重新啓動容器;
  • always - 不管退出狀態是如何,都重啓容器;

參考:https://blog.csdn.net/menghuanbeike/article/details/79261828

附件

Docker相關書

http://www.javashuo.com/article/p-ctohgjuq-dd.html

https://blog.csdn.net/icannotdebug/article/details/82352825

相關文章
相關標籤/搜索