docker官網:www.docker.com/php
Docker hub 官網:hub.docker.com/html
官方安裝教程地址:https://docs.docker.com/engine/install/centos/
java
cat /etc/redhat-release ### 查看centos版本
CentOS Linux release 7.7.1908 (Core)
uname -r ### 查看當前內核版本
3.10.0-514.el7.x86_64
yum -y update ### 升級內核版本
複製代碼
sudo yum remove docker \ ### \是鏈接符,長命令 一行放不下,用多行來表示。下同
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
複製代碼
$ yum list installed | grep docker
docker-client.x86_64 2:1.13.1-109.gitcccb291.el7.centos @extras
docker-common.x86_64 2:1.13.1-109.gitcccb291.el7.centos @extras
$ yum remove -y docker-client.x86_64
$ yum remove -y docker-common.x86_64
複製代碼
yum -y install gcc
yum -y install gcc-c++
複製代碼
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
複製代碼
yum makecache fast
複製代碼
yum -y install docker-ce
複製代碼
systemctl start docker
複製代碼
docker version ### 查看安裝的docker版本
docker run hello-world ### 老hello-world
複製代碼
mkdir -p /etc/docker ###建立docker配置文件目錄,通常在安裝時就已經自動建立了,可自行查看
vim /etc/docker/daemon.json ### 配置文件,配置鏡像加速
---
#阿里雲
{
"registry-mirrors": ["https://{自已的編碼}.mirror.aliyuncs.com"]
}
---
查詢步驟
登陸阿里雲
點擊容器鏡像服務
點擊鏡像加速器
複製鏡像加速地址
複製代碼
可視化:mysql
完成配置linux
執行 systemctl daemon-reload
systemctl restart docker
使配置生效nginx
$ systemctl stop docker
$ yum -y remove docker-ce
$ rm -rf /var/lib/docker
複製代碼
https://hub.docker.com/
複製代碼
配圖一張c++
輸入框輸入要搜索的鏡像名稱 git
點進去,再點擊Tag選擇版本github
選取本身要的版本,我這裏選擇5.7版本,不寫分號後面的版本號默認下載==latest==版本 spring
回到終端張貼命令進行下載
$ docker pull mysql:5.7 ###拉取鏡像
5.7: Pulling from library/mysql
54fec2fa59d0: Pull complete
bcc6c6145912: Pull complete
951c3d959c9d: Pull complete
05de4d0e206e: Pull complete
319f0394ef42: Pull complete
d9185034607b: Pull complete
013a9c64dadc: Pull complete
e745b3361626: Pull complete
03145d87b451: Pull complete
3991a6b182ee: Pull complete
62335de06f7d: Pull complete
Digest: sha256:e821ca8cc7a44d354486f30c6a193ec6b70a4eed8c8362aeede4e9b8d74b8ebb
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
$ docker images ###查看本地鏡像
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 f965319e89de 3 days ago 448MB
複製代碼
首先咱們要建立一個用於存放各類容器的配置目錄,我建議單獨新建一個目錄,用於存放這些容器和本機掛載的文件,掛載的概念後面會詳細講。
$ mkdir ./dockerappconfig ###這個目錄專門用於存放各種容器和本機掛載文件的存放
$ cd dockerappconfig ### 進入該目錄
$ mkdir dockermysqlconfig ### 建立用於存放mysql的目錄
$ cd dockermysqlconfig ### 進入建立的用於存放mysql配置的目錄
複製代碼
啓動mysql容器應用
$ docker run -d \ ## docker run 命令能夠用鏡像建立容器應用 -d 表示後臺運行
-p 3306:3306 \ ## 端口暴露,前面是宿主機端口,後者是容器內部端口。設置後就能夠經過宿主機端口對容器內部服務進行訪問。
--name=c1_mysql \ ## 給容器起個名字,不設置docker會自動分配一個名字
-v $PWD/conf:/etc/mysql/conf.d \ ## 將主機當前目錄下的 conf/my.cnf 掛載到容器的 /etc/mysql/my.cnf。配置目錄
-v $PWD/logs:/logs \ ## 前面是宿主機目錄執行該命令會自動建立。這個是日誌目錄
-v $PWD/data:/var/lib/mysql \ ## 將主機當前目錄下的data目錄掛載到容器的 /var/lib/mysql 。數據目錄
-e MYSQL_ROOT_PASSWORD=123456 \ ## 設置mysql的密碼
mysql:5.7
---
$ docker run -id \
-p 3306:3306 \
--name=c_mysql \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7
$ docker ps # 查看正在運行的docker容器,能夠看到已經有一個mysql啓動了
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b2a2c5193244 mysql:5.7 "docker-entrypoint.s…" 14 minutes ago Up 14 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp c1_mysql
複製代碼
進入剛纔mysql容器的內部
$ docker exec -it c1_mysql /bin/bash ## -i表示交互模式操做容器,-t表示分配一個僞終端, /bin/bash 表示終端類型
$ root@sfd12/# ls -al
total 84
drwxr-xr-x 1 root root 4096 May 1 10:26 .
drwxr-xr-x 1 root root 4096 May 1 10:26 ..
-rwxr-xr-x 1 root root 0 May 1 10:26 .dockerenv
drwxr-xr-x 1 root root 4096 Apr 28 01:53 bin
drwxr-xr-x 2 root root 4096 Feb 1 17:09 boot
drwxr-xr-x 5 root root 340 May 1 10:26 dev
drwxr-xr-x 2 root root 4096 Apr 23 04:14 docker-entrypoint-initdb.d
lrwxrwxrwx 1 root root 34 Apr 28 01:53 entrypoint.sh -> usr/local/bin/docker-entrypoint.sh
drwxr-xr-x 1 root root 4096 May 1 10:26 etc
drwxr-xr-x 2 root root 4096 Feb 1 17:09 home
drwxr-xr-x 1 root root 4096 Apr 23 04:13 lib
drwxr-xr-x 2 root root 4096 Apr 22 00:00 lib64
drwxr-xr-x 2 root root 4096 May 1 10:26 logs
drwxr-xr-x 2 root root 4096 Apr 22 00:00 media
drwxr-xr-x 2 root root 4096 Apr 22 00:00 mnt
drwxr-xr-x 2 root root 4096 Apr 22 00:00 opt
dr-xr-xr-x 92 root root 0 May 1 10:26 proc
drwx------ 1 root root 4096 May 1 10:28 root
drwxr-xr-x 1 root root 4096 Apr 28 01:53 run
drwxr-xr-x 2 root root 4096 Apr 22 00:00 sbin
drwxr-xr-x 2 root root 4096 Apr 22 00:00 srv
dr-xr-xr-x 13 root root 0 May 1 10:26 sys
drwxrwxrwt 1 root root 4096 May 1 10:27 tmp
drwxr-xr-x 1 root root 4096 Apr 22 00:00 usr
drwxr-xr-x 1 root root 4096 Apr 22 00:00 var
$ root@sfd12/# mysql -uroot -p123456 ## 登陸mysql
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.30 MySQL Community Server (GPL)
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
mysql> exit
Bye
複製代碼
查看docker爲咱們建立的宿主機目錄
$ ll
drwxr-xr-x 2 root root 4096 5月 1 18:26 conf
drwxr-xr-x 5 systemd-bus-proxy root 4096 5月 1 18:27 data
drwxr-xr-x 2 root root 4096 5月 1 18:26 logs
複製代碼
上圖一張
步驟:拉取Nginx鏡像、設置配置文件掛載目錄、用鏡像啓動一個Nginx容器應用。
爲了搞清楚容器中的Nginx配置文件關係,咱們能夠先啓動一個不設置配置文件掛載的Nginx。
$ docker run -it --name=temp_nginx nginx:1.17 /bin/bash
$ ls -al
drwxr-xr-x 1 root root 4096 May 1 16:07 .
drwxr-xr-x 1 root root 4096 May 1 16:07 ..
-rwxr-xr-x 1 root root 0 May 1 16:07 .dockerenv
drwxr-xr-x 2 root root 4096 Apr 22 00:00 bin
drwxr-xr-x 2 root root 4096 Feb 1 17:09 boot
drwxr-xr-x 5 root root 360 May 1 16:07 dev
drwxr-xr-x 1 root root 4096 May 1 16:07 etc
drwxr-xr-x 2 root root 4096 Feb 1 17:09 home
drwxr-xr-x 1 root root 4096 Apr 23 13:02 lib
drwxr-xr-x 2 root root 4096 Apr 22 00:00 lib64
drwxr-xr-x 2 root root 4096 Apr 22 00:00 media
drwxr-xr-x 2 root root 4096 Apr 22 00:00 mnt
drwxr-xr-x 2 root root 4096 Apr 22 00:00 opt
dr-xr-xr-x 100 root root 0 May 1 16:07 proc
drwx------ 2 root root 4096 Apr 22 00:00 root
drwxr-xr-x 3 root root 4096 Apr 22 00:00 run
drwxr-xr-x 2 root root 4096 Apr 22 00:00 sbin
drwxr-xr-x 2 root root 4096 Apr 22 00:00 srv
dr-xr-xr-x 13 root root 0 May 1 10:52 sys
drwxrwxrwt 1 root root 4096 Apr 23 13:02 tmp
drwxr-xr-x 1 root root 4096 Apr 22 00:00 usr
drwxr-xr-x 1 root root 4096 Apr 22 00:00 var
複製代碼
咱們重點關注下面四個目錄或文件
$ /etc/nginx/nginx.conf //nginx的默認加載配置文件
$ /var/log/nginx //日誌目錄
$ /usr/share/nginx/html //首頁
$ /etc/nginx/conf.d/default.conf //默認配置
複製代碼
/etc/nginx/nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
複製代碼
/etc/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
複製代碼
方便咱們後面的管理,咱們能夠將這四個位置在宿主機上建立目錄保存,在宿主機上建立相似下面的目錄。
使用下面的命令將docker容器中的nginx相關文件拷貝到上述目錄
docker cp 容器id:/etc/nginx/nginx.conf /path/dockernginxconfig/conf
docker cp 容器id:/etc/nginx/conf.d/default.conf /path/dockernginxconfig/conf
docker cp 容器id:/usr/share/nginx/html/index.html /path/dockernginxconfig/html
docker cp 容器id:/usr/share/nginx/html/50x.html /path/dockernginxconfig/html
複製代碼
刪除上面建立的nginx容器
$ docker stop 容器id
$ docker rm 容器id
複製代碼
從新建立nginx容器
$ docker run -d \
-p 80:80 \
--name=c1_nginx \
-v /path/dockernginxconfig/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /path/dockernginxconfig/conf/default.conf:/etc/nginx/conf.d/default.conf \
-v /path/dockernginxconfig/html:/usr/share/nginx/html \
-v /path/dockernginxconfig/logs:/var/log/nginx \
nginx:1.17
複製代碼
一切順利訪問80端口會出現下面的信息
做用:一、用來持久化容器運行產生的數據,如mysql的數據。二、容器之間進行數據共享。
使用方式
### 經過docker命令在啓動容器的時候加上
$ docker run -id \
-p 3306:3306 \
--name=c_mysql \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7
複製代碼
### 經過DockerFile設置數據卷,經過DockerFile不能實現宿主機和容器之間的掛載,由於不一樣的主機可能目錄存在不同。只支持在容器中添加數據卷。因此咱們先經過DockerFile設置好容器內部的數據卷,而後DockerFile build成鏡像。而後用命令啓動。
$ # volume test DockerFile
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,--------success1"
CMD /bin/bash
---
$ docker build -f /root/mydockerFile/dockerfile1 -t mycentos .
執行上述的命令,生成容器,若是未指明宿主機和宿主機的路徑映射,docker會自動生成一個宿主機的路徑用於掛載,用`docker inspect 容器id` 可查看docker爲咱們生成的宿主機對應目錄
---
備註:Docker掛載主機目錄Docker訪問出現cannot open directory .: Permission denied
解決辦法:在掛載目錄後多加一個--privileged=true參數便可
複製代碼
同鏡像容器之間數據卷的傳遞
$ docker run -d --name=dc01 mycentos ## 啓動一個容器命名爲dc01
$ docker run -d --name=dc02 --volumes-from dc01 mycentos ## 啓動第二個容器 --volumes-from用於關聯dc01的數據卷
$ docker run -d --name=dc03 --volumes-from dc01 mycentos ## 啓動第三個容器
這三個容器之間的數據卷的修改會相互傳遞、互相影響。某個的修改都會影響到另外兩個,即便刪除了dc01,在修改dc02的數據依然能夠傳遞到dc03.
複製代碼
數據卷使用的細節:
一、可掛載單個文件也可掛載一個目錄
二、掛載的文件或目錄能夠不存在,沒有docker會自動建立
三、默認讀寫權限是rw可讀可寫
四、掛載成功後,容器和宿主機對掛載的目錄或文件修改會雙向共享
五、容器中止運行後,宿主機在容器中止運行期間對掛載的文件或目錄進行修改,當容器再次啓動後,會立刻獲取宿主機修改的內容
六、
docker run -d -v 宿主機目錄或文件:容器目錄或文件:ro 鏡像名
, 加了ro後,表示readOnly,這時候容器就只有讀取的權限,不能修改內容。只有主機有修改的權限。
DockerFile是什麼
DockerFile是用來構建鏡像的文件
官方CentOS DockerFile文件
FROM scratch
ADD centos-7-x86_64-docker.tar.xz /
LABEL org.label-schema.schema-version="1.0" \ org.label-schema.name="CentOS Base Image" \ org.label-schema.vendor="CentOS" \ org.label-schema.license="GPLv2" \ org.label-schema.build-date="20191001"
CMD ["/bin/bash"] 複製代碼
保留字指令
保留字 | 做用 | 備註 |
---|---|---|
FROM | 指定父鏡像 | 指定dockerfile基於那個image構建 |
MAINTAINER | 做者信息 | 用來標明這個dockerfile誰寫的 |
LABEL | 標籤 | 用來標明dockerfile的標籤 可使用Label代替Maintainer 最終都是在docker image基本信息中能夠查看 |
RUN | 執行命令 | 執行一段命令 默認是/bin/sh 格式: RUN command 或者 RUN ["command" , "param1","param2"] |
CMD | 容器啓動命令 | 提供啓動容器時候的默認命令 和ENTRYPOINT配合使用.格式 CMD command param1 param2 或者 CMD ["command" , "param1","param2"] |
ENTRYPOINT | 入口 | 通常在製做一些執行就關閉的容器中會使用 |
COPY | 複製文件 | build的時候複製文件到image中 |
ADD | 添加文件 | build的時候添加文件到image中 不只僅侷限於當前build上下文 能夠來源於遠程服務 |
ENV | 環境變量 | 指定build時候的環境變量 能夠在啓動的容器的時候 經過-e覆蓋 格式ENV name=value |
ARG | 構建參數 | 構建參數 只在構建的時候使用的參數 若是有ENV 那麼ENV的相同名字的值始終覆蓋arg的參數 |
VOLUME | 定義外部能夠掛載的數據卷 | 指定build的image那些目錄能夠啓動的時候掛載到文件系統中 啓動容器的時候使用 -v 綁定 格式 VOLUME ["目錄"] |
EXPOSE | 暴露端口 | 定義容器運行的時候監聽的端口 啓動容器的使用-p來綁定暴露端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp |
WORKDIR | 工做目錄 | 指定容器內部的工做目錄 若是沒有建立則自動建立 若是指定/ 使用的是絕對地址 若是不是/開頭那麼是在上一條workdir的路徑的相對路徑 |
USER | 指定執行用戶 | 指定build或者啓動的時候 用戶 在RUN CMD ENTRYPONT執行的時候的用戶 |
HEALTHCHECK | 健康檢查 | 指定監測當前容器的健康監測的命令 基本上沒用 由於不少時候 應用自己有健康監測機制 |
ONBUILD | 觸發器 | 當存在ONBUILD關鍵字的鏡像做爲基礎鏡像的時候 當執行FROM完成以後 會執行 ONBUILD的命令 可是不影響當前鏡像 用處也不怎麼大 |
STOPSIGNAL | 發送信號量到宿主機 | 該STOPSIGNAL指令設置將發送到容器的系統調用信號以退出。 |
SHELL | 指定執行腳本的shell | 指定RUN CMD ENTRYPOINT 執行命令的時候 使用的shell |
CMD 和 ENTRYPOINT
二者的用途都是指定容器啓動時要執行的命令
CMD
:DockerFile能夠有多個CMD指令,可是隻有最後一個生效,前面的CMD指令會不起做用。CMD指令會被docker run 後面的參數進行替換,如執行docker run -d -p 8080:8080 tomcat ls -l命令啓動容器,因爲加了 ls -l這個指令,會致使DockerFile中啓動tomcat的指令失效,致使tomcat啓動失敗。
ENTRYPOINT
: ENTRYPOINT會組合docker run後面的參數,加強命令功能,而不會直接失效。
ADD 和 COPY
用途:二者均可以設置的鏡像上下文構建環境的的文件能夠是壓縮包拷貝到容器內。
ADD
: 能夠解壓tar類型的jar包
COPY
:只是單純的複製文件,不提供解壓功能。
DockerFile基礎知識
一、每條保留字指令都必須爲大寫字母且後面要跟隨至少一個參數
二、指令按從上到下,順序執行
三、#表示註釋
四、每條指令都會建立新的鏡像層,並對鏡像進行提交
基礎鏡像(scratch)
其餘鏡像大部分都是基於scratch鏡像來構建的 官網描述:
This image is most useful in the context of building base images (such as debian and busybox) or super minimal images (that contain only a single binary and whatever it requires, such as hello-world).
As of Docker 1.5.0 (specifically, docker/docker#8827), FROM scratch is a no-op in the Dockerfile, and will not create an extra layer in your image (so a previously 2-layer image will be a 1-layer image instead).
From docs.docker.com/engine/user…
You can use Docker’s reserved, minimal image, scratch, as a starting point for building containers. Using the scratch 「image」 signals to the build process that you want the next command in the Dockerfile to be the first filesystem layer in your image.
While scratch appears in Docker’s repository on the hub, you can’t pull it, run it, or tag any image with the name scratch. Instead, you can refer to it in your Dockerfile. For example, to create a minimal container using scratch
最後一段咱們看到,明確說明這個鏡像雖然在倉庫中,可是咱們不能拉取,也沒法運行這個鏡像,也不能自定義鏡像名爲scratch。可是能夠在Dockerfile文件中使用這個鏡像去構建其餘鏡像。
$ vim myCentOSDockerFile ### 建立一個自定義的CentOS DockerFile文件
複製代碼
文件內容:
FROM centos
MAINTAINER slf<slflbcr@126.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim RUN yum -y install net-tools
EXPOSE 80
CMD /bin/bash
### 咱們給基礎的CentOS鏡像安裝了vim編輯器和net-tools工具,同時暴露了80端口,設置了登陸容器的落腳點爲/usr/local
複製代碼
$ docker build -f ./myCentOSDockerFile -t myCentOS:1.0 .
### 命令解釋:docker build -f DockerFile的文件路徑 -t 鏡像的名稱 . ### 點表示構建鏡像的上下文環境爲當前目錄,在須要拷貝文件到容器中時用於定位文件的位置。
複製代碼
FROM centos
MAINTAINER slf<slflbcr@126.com>
#把宿主機當前上下文的c.txt拷貝到容器/usr/local/路徑下
COPY c.txt /usr/local/cincontainer.txt
#把java與tomcat添加到容器中
ADD jdk-8u171-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.8.tar.gz /usr/local/
#安裝vim編輯器
RUN yum -y install vim
#設置工做訪問時候的WORKDIR路徑,登陸落腳點
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java與tomcat環境變量
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器運行時監聽的端口
EXPOSE 8080
#啓動時運行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh" ]
# CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.8/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out
複製代碼
上面咱們介紹到了DockerFile能夠構建鏡像,那麼下面咱們來介紹一下鏡像。
docker鏡像是什麼
==docker鏡像實際上就是一層一層的文件系統組成的,鏡像啓動的容器使用的是宿主機內核。這就是爲何容器時輕量級的緣由,內核共享。==
docker使用的是聯合文件系統(UnionFS)
Union文件系統(UnionFS)是一種分層、輕量級而且高性能的文件系統,它支持對文件系統的修改做爲一次提交來一層層的疊加,同時能夠將不一樣目錄掛載到同一個虛擬文件系統下(unite several directories into a single virtual filesystem)。
Union 文件系統是 Docker鏡像的基礎。鏡像能夠經過分層來進行繼承,基於基礎鏡像(沒有父鏡像),能夠製做各類具體的應用鏡像。
特性:一次同時加載多個文件系統,但從外面看起來,只能看到一個文件系統,聯合加載會把各層文件系統疊加起來,這樣最終的文件系統會包含全部底層的文件和目錄
Docker 鏡像爲何要分層
最大的好處是共享資源,其餘鏡像能夠利用一個基礎鏡像構建本身的鏡像而不用再構建已經存在的鏡像了。
Docker鏡像可讀的
可讀不可寫這種確定是爲了保證安全
當用一個鏡像啓動一個容器後,一個可寫層被加載到鏡像的頂部。這一層一般被稱爲「容器層」,"容器層"之下都是「鏡像層」。
使用容器構建鏡像
命令:$ docker commit -a="做者" -m="提交的描述信息" 容器id 新構建的鏡像名:1.1
$ docker commit -a="slf" -m="description infomation" 容器id mytomcat:1.1
複製代碼
使用DockerFile
這個就不用講了,本身構建dockerFile文件而後運行docker build命令構建鏡像
什麼是Docker Compose
簡單來講就是編排多個docker應用的,對多docker應用進行管理,包括啓動順序之類的。
安裝Docker Compose
# Compose目前已經徹底支持Linux、Mac OS和Windows,在咱們安裝Compose以前,須要先安裝Docker。下面我 們以編譯好的二進制包方式安裝在Linux系統中。
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
若是由於網絡緣由沒法下載,可嘗試下面的國內地址
curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 設置文件可執行權限
chmod +x /usr/local/bin/docker-compose
# 查看版本信息
docker-compose -version
複製代碼
# 二進制包方式安裝的,刪除二進制文件便可
rm /usr/local/bin/docker-compose
複製代碼
使用docker compose編排nginx+springboot項目
首先咱們要準備一個springboot項目,打成jar包,上傳到服務器。而後爲這個springboot項目編寫DockerFile文件,根據DockerFIle文件構建該springboot項目的鏡像,操做以下。
上面springboot項目的jar包,下面是DockerFile文件。
springboot項目很簡單就是寫了接口,輸出hello_docker.
springboot_demo_dockerfile文件內容
FROM java:8
MAINTAINER slf <slflbcr@126.com>
ADD ./docker-springboot-demo-0.0.1-SNAPSHOT.jar springbootapp.jar CMD java -jar springbootapp.jar 複製代碼
執行鏡像構建命令構建springboot項目的docker鏡像
$ docker build -f ./springboot_demo_dockerfile -t myspingbootdemo .
下面是構建信息
Sending build context to Docker daemon 17.62MB
Step 1/4 : FROM java:8
---> d23bdf5b1b1b
Step 2/4 : MAINTAINER slf <slflbcr@126.com>
---> Running in b6167106f4f8
Removing intermediate container b6167106f4f8
---> dabcebde817c
Step 3/4 : ADD ./docker-springboot-demo-0.0.1-SNAPSHOT.jar springbootapp.jar
---> bd4afe649cd5
Step 4/4 : CMD java -jar springbootapp.jar
---> Running in 51950eac8269
Removing intermediate container 51950eac8269
---> e6107dc5fa7b
Successfully built e6107dc5fa7b
Successfully tagged springbootdemo:1.1
複製代碼
查看鏡像是否構建成功
docker images
複製代碼
一、建立一個測試目錄
mkdir ~/docker-compose ### 這裏是在當前用戶目錄下建立的測試目錄,這個目錄你能夠自定義。
cd ~/docker-compose
複製代碼
二、編寫docker-compose.yml文件
vim docker-compose.yml ## 名字必定是docker-compose.yml 否則會報錯
複製代碼
version: '3'
services:
nginx: ## 服務名,本身定義
image: nginx:1.17 ## 鏡像名
ports: ## 宿主機和容器的端口映射,至關於docker run 後面的 -p 80:80
- 80:80
links: ## 關聯的服務
- app
volumes: ## 掛載數據卷 至關於docker run 後面的 -v ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/conf.d:/etc/nginx/conf.d
app:
image: springbootdemo:1.1
expose:
- "8080"
複製代碼
三、建立nginx的配置目錄
上面咱們設置nginx的掛載目錄,咱們知道docker中的nginx默認使用的是etc/nginx/conf.d/目錄下的default.conf配置。
咱們在宿主機上的映射目錄建立咱們本身的nginx配置文件代替默認的配置文件。
四、建立./nginx/conf.d 目錄
mkdir -p ./nginx/conf.d
vim mynginx.conf ## 建立本身的nginx配置文件
複製代碼
server {
listen 80;
access_log off;
location / {
proxy_pass http://app:8080;
}
}
複製代碼
上面是配置內容
五、啓動docker-compose 文件
docker-compose up -d ### 之後臺形式啓動編排的服務
複製代碼
六、測試訪問
http:ip/helloDocker
複製代碼
docker-compose up -d # 在後臺啓動服務
docker-compose ps # 查看啓動的服務
docker-compose stop # 中止服務
docker-compose start # 啓動服務
docker-compose restart # 從新啓動服務
複製代碼
# 一、拉取私有倉庫鏡像
docker pull registry
# 二、啓動私有倉庫容器
docker run -id --name=registry -p 5000:5000 registry
# 三、打開瀏覽器 輸入地址http://私有倉庫服務器ip:5000/v2/_catalog,看到{"repositories":[]} 表示私有倉庫 搭建成功
# 四、修改daemon.json
vim /etc/docker/daemon.json
# 在上述文件中添加一個key,保存退出。此步用於讓 docker 信任私有倉庫地址;注意將私有倉庫服務器ip修改成本身私有倉庫服務器真實ip
{"insecure-registries":["私有倉庫服務器ip:5000"]}
# 五、重啓docker 服務
systemctl restart docker
docker start registry
複製代碼
# 一、標記鏡像爲私有倉庫的鏡像
docker tag centos:7 私有倉庫服務器IP:5000/centos:7
# 二、上傳標記的鏡像
docker push 私有倉庫服務器IP:5000/centos:7
複製代碼
#拉取鏡像
docker pull 私有倉庫服務器ip:5000/centos:7
複製代碼
docker images [options]
docker images -a:列出本地全部的鏡像
docker images -q:只顯示鏡像ID
docker images --digests:顯示鏡像的摘要信息
docker images —no-trunc:顯示完整的鏡像信息
docker search 某個鏡像的名字:搜索相關鏡像
docker pull 某個鏡像的名字:拉取該鏡像的latest版本
docker pull 某個鏡像的名字:tag 拉取該鏡像的指定版本(docker pull tomcat:9.0)
docker rmi -f 鏡像ID f表示強制刪除
docker rmi -f 鏡像1ID:tag 鏡像2ID:tag :刪除多個鏡像
docker rmi -f $(docker images -aq) 刪除所有
docker tag centos:7 私有倉庫服務器IP:5000/centos:7:標記鏡像爲私有倉庫的鏡像
docker push 私有倉庫服務器IP:5000/centos:7:上傳標記的鏡像
docker pull 私有倉庫服務器ip:5000/centos:7:拉取鏡像
docker run [options] ==IMAGER== [command] [ARG…]:新建並啓動容器
OPTIONS說明(經常使用):有些是一個減號,有些是兩個減號
--name="容器新名字": 爲容器指定一個名稱;
-d: 後臺運行容器,並返回容器ID,也即啓動守護式容器;
-i:以交互模式運行容器,一般與 -t 同時使用;
-t:爲容器從新分配一個僞輸入終端,一般與 -i 同時使用;
-P: 隨機端口映射;
-p: 指定端口映射,有如下四種格式
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
docker ps [options]:列出當前正在運行的容器
OPTIONS說明(經常使用):
-a :列出當前全部正在運行的容器+歷史上運行過的
-l :顯示最近建立的容器。
-n:顯示最近n個建立的容器。
-q :靜默模式,只顯示容器編號。
--no-trunc :不截斷輸出。
docker start 容器ID或容器名:啓動容器
docker restart 容器ID或容器名:重啓容器
docker stop 容器ID獲或容器名:中止容器
docker kill 容器ID或容器名:強制中止容器
docker rm 容器ID或容器名: 刪除容器
docker run -d 容器ID或容器名
很重要的要說明的一點: ==Docker容器後臺運行,就必須有一個前臺進程.==
Nginx咱們正常是之後臺進程啓動的,可是在docker中的nginx咱們會看到
nginx dockerfile 最後啓動的命令是
==CMD ["nginx", "-g", "daemon off;"]==將nginx之前臺進程的形式運行,這樣保證docker有一個前臺進程,docker不會退出。