目錄php
Docker 核心概念以下:html
快速運行java
節省資源python
Docker 容器直接運行在 Docker 引擎之上,可直接利用宿主機硬件資源,無需佔用過多的系統開銷mysql
便於交付linux
Docker 的交付物是鏡像,鏡像不只封裝了程序,還包含了運行程序的環境web
容易管理spring
經過 Docker 客戶端直接操做 Docker 引擎,很是方便的管理 Docker 鏡像和容器sql
列出鏡像docker
[root@dev ~]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos latest ab9a80ab07d0 2 weeks ago 201.8 MB
以上表格包含 5 個字段,其中
REPOSITORY
鏡像倉庫的名稱TAG
鏡像的標籤,通常帶有版本或別名,這裏的 lastest
表示最新版本IMAGE ID
表示鏡像的標識符,稱爲鏡像 ID
,具有惟一性created
表示鏡像的建立時間SIZE
大小拉取鏡像 docker pull
搜索鏡像
執行上面的命令,會輸出帶有 centos 關鍵字的鏡像倉庫。
[root@dev ~]# docker search centos NAME DESCRIPTION STARS OFFICIAL AUTOMATED centos The official build of CentOS. 5070 [OK] ansible/centos7-ansible Ansible on Centos7 119 [OK] jdeathe/centos-ssh CentOS-6 6.10 x86_64 / CentOS-7 7.5.1804 x... 104 [OK] consol/centos-xfce-vnc Centos container with "headless" VNC sessi... 73 [OK] imagine10255/centos6-lnmp-php56 centos6-lnmp-php56 48 [OK] centos/mysql-57-centos7 MySQL 5.7 SQL database server 45 tutum/centos Simple CentOS docker image with SSH access 43 gluster/gluster-centos Official GlusterFS Image [ CentOS-7 + Glu... 38 [OK] openshift/base-centos7 A Centos7 derived base image for Source-To... 37 centos/postgresql-96-centos7 PostgreSQL is an advanced Object-Relationa... 36 centos/python-35-centos7 Platform for building and running Python 3... 33 kinogmt/centos-ssh CentOS with SSH 25 [OK] openshift/jenkins-2-centos7 A Centos7 based Jenkins v2.x image for use... 20 centos/php-56-centos7 Platform for building and running PHP 5.6 ... 17 pivotaldata/centos-gpdb-dev CentOS image for GPDB development. Tag nam... 10 openshift/wildfly-101-centos7 A Centos7 based WildFly v10.1 image for us... 6 openshift/jenkins-1-centos7 DEPRECATED: A Centos7 based Jenkins v1.x i... 4 darksheer/centos Base Centos Image -- Updated hourly 3 [OK] pivotaldata/centos-mingw Using the mingw toolchain to cross-compile... 2 pivotaldata/centos Base centos, freshened up a little with a ... 2 blacklabelops/centos CentOS Base Image! Built and Updates Daily! 1 [OK] pivotaldata/centos-gcc-toolchain CentOS with a toolchain, but unaffiliated ... 1 smartentry/centos centos with smartentry 0 [OK] pivotaldata/centos7-build CentosOS 7 image for GPDB compilation 0 pivotaldata/centos7-test CentosOS 7 image for GPDB testing 0
字段的意義以下
NAME
表示鏡像倉庫的名稱
/
表示 Docker 官方發佈的倉庫DESCRIPTION
表示鏡像倉庫描述STARS
表示鏡像的收藏數,該數字體現該倉庫的受歡迎程度OFFICAL
是否爲官方倉庫,官方倉庫具備更高的安全性AUTOMATED
是否自動構建鏡像倉庫,用戶能夠將本身的 Docker Hub 綁定到 GitHub 或者 BitBucket 上,當代碼提交後,能夠自動構建鏡像倉庫導出和導入鏡像
[root@dev docker]# docker save centos > centos.tar [root@dev docker]# docker load < centos.tar
當獲取鏡像後,就能基於鏡像啓動相應的容器。
建立並啓動容器
[root@dev docker]# docker run -i -t centos /bin/bash
-i
選項: 表示啓動容器後,打開標準輸入設備 (STDIN) ,可以使用鍵盤進行輸入-t
選項: 表示啓動容器後,分配一個僞終端,與服務器獎勵一個會話centos
參數: 表示須要運行的鏡像名稱,標準格式爲 centos:latest
,若爲 latest
版本,能夠省略/bin/bash
參數: 表示運行容器中的 bash 應用程序執行該命令後,會首先從本地拉取 centos 鏡像,若是本地沒有此鏡像,就會從 docker hub 上拉取並存放在本地,隨後就能根據鏡像建立並啓動 centos 容器。
此時能夠參考容器的命令提示符:
[root@5b51855797e3 /]#
其中
root
表示當前登陸的用戶名,默認都是以超級管理員身份登陸的5b51855797e3
表示容器的標識符,通常稱爲 「容器 ID"/
表示當前路徑可在 #
符號後輸入 Linux 命令,執行 exit
命令退出容器
列出容器
[root@dev ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5b51855797e3 centos "/bin/bash" 17 minutes ago Up 17 minutes sharp_mccarthy
結果字段的具體意義以下
CONTAINER ID
表示容器 IDIMAGE
鏡像名稱COMMAND
啓動容器時運行的命令,Docker 要求在啓動容器時須要運行一個命令CREATED
容器建立時間STAUS
表示容器運行的狀態
Up
表示運行中Existed
表示已退出PORTS
表示容器須要對外暴露的端口號NAMES
容器的名稱docker ps
命令包括一些經常使用選項,描述以下
-a
列出全部的容器,包含全部的狀態-l
表示列出最近建立的容器,包括全部的狀態-n
表示列出 n 個 最近建立的容器,包括全部的狀態-q
表示僅僅列出 CONTAINER ID 字段-s
表示在輸出表格中增長一個 SIZE 字段進入容器
[root@dev ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c6e7132314fd centos "/bin/bash" 2 minutes ago Up 2 minutes happy_colden [root@dev ~]# docker attach c6e7132314fd [root@c6e7132314fd /]#
只能進入運行中的數據,不能進入已中止的數據。
執行命令
使用如下命令像運行中的容器執行具體的命令
[root@dev ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e5fa12acb939 centos "/bin/bash" 20 seconds ago Up 19 seconds pensive_fermat [root@dev ~]# docker exec -i -t e5fa12acb939 ls -l total 56 -rw-r--r-- 1 root root 12076 Dec 5 01:37 anaconda-post.log lrwxrwxrwx 1 root root 7 Dec 5 01:36 bin -> usr/bin drwxr-xr-x 5 root root 380 Dec 26 09:52 dev drwxr-xr-x 47 root root 4096 Dec 26 09:52 etc drwxr-xr-x 2 root root 4096 Apr 11 2018 home lrwxrwxrwx 1 root root 7 Dec 5 01:36 lib -> usr/lib lrwxrwxrwx 1 root root 9 Dec 5 01:36 lib64 -> usr/lib64 drwxr-xr-x 2 root root 4096 Apr 11 2018 media drwxr-xr-x 2 root root 4096 Apr 11 2018 mnt drwxr-xr-x 2 root root 4096 Apr 11 2018 opt dr-xr-xr-x 192 root root 0 Dec 26 09:52 proc dr-xr-x--- 2 root root 4096 Dec 5 01:37 root drwxr-xr-x 11 root root 4096 Dec 5 01:37 run lrwxrwxrwx 1 root root 8 Dec 5 01:36 sbin -> usr/sbin drwxr-xr-x 2 root root 4096 Apr 11 2018 srv drwxr-xr-x 13 root root 0 Dec 26 09:45 sys drwxrwxrwt 7 root root 4096 Dec 5 01:37 tmp drwxr-xr-x 13 root root 4096 Dec 5 01:36 usr drwxr-xr-x 18 root root 4096 Dec 5 01:36 var
中止容器
使用下面命令中止運行中的容器(須要指定 ID 或者容器名稱):
docker stop e5fa12acb939
該命令會想容器發送 SIGTERM 信號,將等待很短的時間,再對容器發送 SIGKILL 信號,會當即終止容器。
終止容器
docker kill e5fa12acb939
啓動容器
能夠啓動已經中止的容器
docker start e5fa12acb939
重啓容器
docker restart e5fa12acb939
刪除容器
docker rm e5fa12acb939
不能刪除正在運行的容器,只能將它中止後,再刪除。
導入和導出容器
docker export e5fa12acb939 > centos.tar docker import foo.tar reycg/centos:latest
docker help
總體步驟
~/software
目錄下~/software
目錄掛載到容器的 /mnt/software
目錄docker commit
命令,提交當前容器爲 reycg/java
的鏡像reycg/java
鏡像,啓動一個 java
容器,並輸出 java
版本號,從而驗證鏡像是否可用,最後自動刪除當前容器具體命令以下,前 3 個步驟
[root@dev software]# ls jdk-8u121-linux-x64.tar.gz [root@architecture01.general.dev.tj1 software]# docker run -i -t -v ~/software/:/mnt/software centos /bin/bash [root@b3d2064d1a3d /]# ls anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var [root@b3d2064d1a3d /]# ll /mnt/software/ total 178956 -rw-r--r-- 1 root root 183246769 Dec 26 12:41 jdk-8u121-linux-x64.tar.gz [root@b3d2064d1a3d /]# tar -zxf /mnt/software/jdk-8u121-linux-x64.tar.gz -C /opt/ [root@b3d2064d1a3d /]# ll /opt/ total 4 drwxr-xr-x 8 10 143 4096 Dec 13 2016 jdk1.8.0_121 [root@b3d2064d1a3d /]# ln -s /opt/jdk1.8.0_121 /opt/jdk [root@b3d2064d1a3d /]# ll /opt/jdk lrwxrwxrwx 1 root root 17 Dec 26 12:44 /opt/jdk -> /opt/jdk1.8.0_121 [root@b3d2064d1a3d /]# /opt/jdk/bin/java -version java version "1.8.0_121" Java(TM) SE Runtime Environment (build 1.8.0_121-b13) Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
步驟 4, 5
[root@dev software]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE reycg/java latest d3c1df69ffb2 13 seconds ago 571.9 MB centos latest ab9a80ab07d0 2 weeks ago 201.8 MB [root@dev software]# docker run --rm reycg/java /opt/jdk/bin/java -version java version "1.8.0_121" Java(TM) SE Runtime Environment (build 1.8.0_121-b13) Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
上面過程是手工完成的,除了這種方式,咱們還能夠寫一段腳本,讓其自動運行一樣能夠生成鏡像,這就是下面講的 Dockerfile。
Dockerfile 腳本文件,包括一些指令,經過學習這些指令,能夠快速的編寫鏡像的構建腳本,從而讓構建鏡像作到自動化。下面先了解下 Docker file 的基本結構。
設置基礎鏡像
FROM centos:latest
FROM
指令的值有固定的格式,即「倉庫名:標籤名」,若使用基礎鏡像的最新版本,則 latest
簽名能夠省略,不然須要指定基礎鏡像的具體版本。
設置維護者信息
MAINTAINER "reycg"<reycg2017@163.com>
MAINTAINER
指令沒有固定格式,建議使用姓名與郵箱的格式,能夠同時指定多我的
設置須要添加到容器中的文件
ADD jdk-8u121-linux-x64.tar.gz /opt
ADD
指令的第一個參數是宿主機的來源路徑(可以使用相對路徑),第二個參數是容器的目標路徑(必須爲絕對路徑)。
ADD
指令還能夠自動解壓來源路徑中的壓縮包,將解壓後的文件複製到目標路徑中。
除了 ADD
指令,還有一個相似的 COPY
指令,只是它只能完成簡單的複製,而沒有自動解壓的功能。
設置鏡像製做過程當中須要執行的命令
RUN ln -s /opt/jdk1.8.0_121 /opt/jdk
使用 RUN
指令能夠執行一系列構建鏡像所需的命令,若是要執行多條命令,可使用多行 RUN
命令,但最好是經過 \
換行符合併成一條,這樣可以減少所構建的鏡像的體積。
設置容器啓動時須要執行的命令
CMD /opt/jdk/bin/java -version
若是在使用 docker run
命令時指定了須要執行的命令,會覆蓋 Dockerfile CMD 指令。
在 Dockerfile 還有一個相似的 ENTRYPOINT
指令,只是後者所執行的指令不能被 docker run
覆蓋。
瞭解了 Dockerfile 的基本結果後,後面咱們使用 Dockerfile 構建一個 java 鏡像。
將上一節的 Dockerfile 指令整理一下,獲得彙總的文件內容:
FROM centos:latest MAINTAINER "reycg"<reycg2017@163.com> ADD jdk-8u121-linux-x64.tar.gz /opt RUN ln -s /opt/jdk1.8.0_121 /opt/jdk CMD /opt/jdk/bin/java -version
下面就使用 docker build
命令讀取 Dockerfile
文件,並構建一個鏡像:
[root@dev software]# docker build -t reycg/java . Sending build context to Docker daemon 183.2 MB Sending build context to Docker daemon Step 0 : FROM centos:latest ---> ab9a80ab07d0 Step 1 : MAINTAINER "reycg"<reycg2017@163.com> ---> Running in ae37609d29d2 ---> 51911673bc4a Removing intermediate container ae37609d29d2 Step 2 : ADD jdk-8u121-linux-x64.tar.gz /opt ---> e4743bdb5bcd Removing intermediate container 4ef5335f53e0 Step 3 : RUN ln -s /opt/jdk1.8.0_121 /opt/jdk ---> Running in 513ba2d0d2ff ---> 097586ce97cd Removing intermediate container 513ba2d0d2ff Step 4 : CMD /opt/jdk/bin/java -version ---> Running in cde9191ea078 ---> cd4c35cfb8ac Removing intermediate container cde9191ea078 Successfully built cd4c35cfb8ac
當執行成功後,將輸出最終的鏡像 ID (d3c1df69ffb2 ),此時可經過 docker images
查看最終生成的鏡像
[root@dev software]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE reycg/java latest cd4c35cfb8ac 27 minutes ago 571.9 MB <none> <none> d3c1df69ffb2 56 minutes ago 571.9 MB centos latest ab9a80ab07d0 2 weeks ago 201.8 MB
此時可以使用 docker tag
命令來修改鏡像的倉庫名和標籤名。
docker tag d3c1df69ffb2 reycg/java:1.0
此時再查看當前的鏡像
[root@dev software]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE reycg/java latest cd4c35cfb8ac 33 minutes ago 571.9 MB reycg/java 1.0 d3c1df69ffb2 About an hour ago 571.9 MB
安裝 jdk 後都須要設置一個 JAVA_HOME 和 PATH 環境變量,這樣就能夠在命令行中直接使用 Java 命令了。可使用 ENV
指令來完成。
ENV JAVA_HOME /opt/jdk ENV PATH $JAVA_HOME/bin:$PATH
這樣完整的 Dockerfile 指令以下
FROM centos:latest MAINTAINER "reycg"<reycg2017@163.com> ADD jdk-8u121-linux-x64.tar.gz /opt RUN ln -s /opt/jdk1.8.0_121 /opt/jdk ENV JAVA_HOME /opt/jdk ENV PATH $JAVA_HOME/bin:$PATH CMD java -version
在微服務架構中,交付方式由應用程序轉變爲 Docker 鏡像,將服務及其運行環境封裝在 Docker 鏡像中。若須要發佈服務時,只須要根據鏡像啓動相應的容器便可。
標準的 Spring Boot 應用程序的 Maven 配置以下
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>demo.msa</groupId> <artifactId>mesa-hello</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>mesa-hello</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.3.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
因爲使用了 spring-boot-maven-plugin
插件,在 mvn package
打包後將生成一個直接運行的 jar 包,生成的 jar 包默認文件名格式爲 ${project.build.finalName}
,它是一個 maven 屬性,至關於 ${project.artifactId}:${project.version}
.
咱們的應用是基於 Maven 構建的,Maven 規範要求咱們將全部的資源放在 src/main/resources
資源目錄下。 Dockerfile 也是資源文件,所以也須要放在該目錄下。完整的文件內容以下:
FROM java MAINTAINER "ReyCG"<reycg2017@163.com> ADD mesa-hello-0.0.1-SNAPSHOT.jar app.jar EXPOSE 8080 CMD java -jar app.jar
默認狀況下, Spring Boot 開啓的是 8080 端口,所以使用 ExPOSE
指令暴露出來。
最後使用 java -jar app.jar
執行 jar 包。
Dockerfile 建立成功了,下一步就是讀取 Dockerfile,並構建 Docker 鏡像。而這些則是由 spotfy 公司的 docker-maven-plugin 插件來完成的。具體 maven 配置以下:
<plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.4.10</version> <configuration> <imageName>${project.groupId}/${project.artifactId}:${project.version}</imageName> <dockerDirectory>${project.build.outputDirectory}</dockerDirectory> <resources> <resource> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin>
下面來解釋下 configuration
片斷
imageName
Docker 鏡像名稱,它由 ${project.groupId}
倉庫名,${project.artifactId}
鏡像名和 ${project.version}
標籤名組成dockerDirectory
指定 Dockerfile 文件所在的目錄resources/resource/directory
指定須要複製的根目錄,其中 ${project.build.directory}
則表示 target 目錄resources/resource/directory
指定須要複製的文件執行 mvn docker:build
便可編譯鏡像。編譯成功後,查看一下
[tomcat@ root]$ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE demo.msa/mesa-hello 0.0.1-SNAPSHOT 67b94db5ac60 About an hour ago 657 MB
在後臺運行容器,並將容器的 8080 端口綁定到宿主機 58080 端口上。
docker run -d -p 58080:8080 demo.msa/mesa-hello:0.0.1-SNAPSHOT
經過瀏覽器訪問 localhost:8080
請求來驗證下。
可使用以下 Docker 命令監控 Docker 容器的運行狀況
[tomcat@ root]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES eb8659f31ca3 demo.msa/mesa-hello:0.0.1-SNAPSHOT "/bin/sh -c 'java -j 37 minutes ago Up 37 minutes 0.0.0.0:58080->8080/tcp sharp_hodgkin [tomcat@ root]$ docker stats eb8659f31ca3 CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O eb8659f31ca3 0.10% 540.2 MB/8.128 GB 6.65% 5.024 kB/7.208 kB
由此命令能夠看出容器的 CPU 使用率,內存使用狀況與使用率,網絡 IO 使用狀況等信息。
從內存使用狀況來看,啓動容器後默認分配了 8.128 GB
的內存,其中已經使用了 540.2 MB
。由此咱們能夠估算出容器應用程序的最大內存,對啓動容器所需分配的內存作出限制,能夠節省更多的宿主機內容。從而能夠啓動更多的容器。
在 docker run
命令中添加 -m
參數就能夠調整容器的內存限制。
[tomcat@ root]$ docker run -d -m 800m -p 58080:8081 demo.msa/mesa-hello:0.0.1-SNAPSHOT 40c7c49d0002c08c72034d97bb39d0b415df7a7eef0bfa959853649c88c8e77c [tomcat@ root]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 40c7c49d0002 demo.msa/mesa-hello:0.0.1-SNAPSHOT "/bin/sh -c 'java -j 4 seconds ago Up 3 seconds 0.0.0.0:58080->8081/tcp dreamy_mcclintock [tomcat@root]$ docker stats 40c7c49d0002 CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O 40c7c49d0002 105.87% 531.8 MB/838.9 MB 63.39% 468 B/558 B
centos 6 如何安裝 docker
https://www.liquidweb.com/kb/how-to-install-docker-on-centos-6/
docker 不能鏈接問題
Get http:///var/run/docker.sock/v1.19/images/json: dial unix /var/run/docker.sock: no such file or directory. Are you trying to connect to a TLS-enabled daemon without TLS?
解決方案 http://www.cnblogs.com/ashinliu/p/5477259.html
http://tinylab.org/use-docker-without-sudo/