什麼是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內容基礎知識:
- 每條保留字指令都必須爲大寫字母且後面跟隨至少一個參數
- 指令按照從上到下順序執行
- #表示註解
- 每條指令都會建立一個新的鏡像層,並對鏡像進行提交
執行大體流程
- 從基礎鏡像運行一個容器
- 執行一條指令並對容器做出修改
- 執行 docker commit 提交一個新的鏡像層
- 基於剛剛提交的鏡像運行一個新的容器
- 執行下一條指令直至全部指令都執行完成
體系結構(保留字指令)
- 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具備如下功能:
- 登陸後的默認路徑
- vim編輯器
- 支持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