docker

安装docker

centos7.6下安装docker

1.卸载旧版本docker

 yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

2.安装工具包

yum install -y yum-utils

3.设置镜像仓库

镜像仓库默认是国外的。保存在/etc/yum.repos.d/docker-ce.repo

因此加上国内的镜像仓库

// (阿里仓库) 
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
// 中央仓库
yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo

4.更新yum软件包的索引

yum makecache fast

5.安装docker

docker-ce社区版 docker-ee企业版,一般都是使用社区版

yum install docker-ce docker-ce-cli containerd.io

6.启动docker

systemctl start docker

7.判断是否安装成功

docker version

8.通过hello world镜像测试

docker run hello-world

docker images

9.阿里云镜像仓库加速

mkdir -p /etc/docker

 tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://30ph068u.mirror.aliyuncs.com"]
}
EOF

// 重启
systemctl daemon-reload

systemctl restart docker

10.设置docker开启自启动

systemctl enable docker.service

// 查看是否自启动
systemctl list-unit-files | grep docker

安装docker-compose

curl -L https://get.daocloud.io/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

docker-compose --version

docker命令

docker命令

启动docker

systemctl start docker

停止docker

systemctl stop docker 

重启docker

systemctl restart docker

查看docker启动状态

systemctl status docker 

设置docker开机自启动

systemctl enable docker

查看docker概要信息

docker info

查看docker帮助文档

docker --help

显示docker版本信息

docker version

docker镜像

镜像命令

docker images [options]

镜像展示的信息
[xqm@centOS7 ~]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        9 months ago        13.3kB
#解释
REPOSITORY  :镜像的仓库源
TAG:镜像的标签
IMAGE ID :镜像的id
CREATED :镜像的创建时间
SIZE :镜像的大小
列出所有镜像

docker images 或 docker images -a

[root@VM-16-17-centos ~]# docker images
REPOSITORY                            TAG              IMAGE ID       CREATED         SIZE
ghcr.io/toeverything/affine           nightly-latest   7df808544cb3   10 days ago     45.4MB
registry.aliyuncs.com/openspug/spug   latest           b866c2266fa5   7 weeks ago     698MB
redis                                 6.0.16           5e9f874f2d50   8 months ago    112MB
nginx                                 1.20.2           50fe74b50e0d   8 months ago    141MB
mysql                                 8.0.27           3218b38490ce   8 months ago    516MB
nacos/nacos-server                    1.4.1            eec289123412   19 months ago   935MB
bladex/sentinel-dashboard             1.8.0            61c10eaefbcf   2 years ago     147MB
daocloud.io/library/rabbitmq          3.8.5            b1526c8ed2ad   2 years ago     156MB
java                                  8                d23bdf5b1b1b   5 years ago     643MB
[root@VM-16-17-centos ~]# docker images -a
REPOSITORY                            TAG              IMAGE ID       CREATED         SIZE
ghcr.io/toeverything/affine           nightly-latest   7df808544cb3   10 days ago     45.4MB
registry.aliyuncs.com/openspug/spug   latest           b866c2266fa5   7 weeks ago     698MB
redis                                 6.0.16           5e9f874f2d50   8 months ago    112MB
nginx                                 1.20.2           50fe74b50e0d   8 months ago    141MB
mysql                                 8.0.27           3218b38490ce   8 months ago    516MB
nacos/nacos-server                    1.4.1            eec289123412   19 months ago   935MB
bladex/sentinel-dashboard             1.8.0            61c10eaefbcf   2 years ago     147MB
daocloud.io/library/rabbitmq          3.8.5            b1526c8ed2ad   2 years ago     156MB
java                                  8                d23bdf5b1b1b   5 years ago     643MB
显示镜像的摘要

docker images --digests

[root@VM-16-17-centos ~]# docker images --digests
REPOSITORY                            TAG              DIGEST                                                                    IMAGE ID       CREATED         SIZE
hello-world                           latest           sha256:2498fce14358aa50ead0cc6c19990fc6ff866ce72aeb5546e1d59caac3d0d60f   feb5d9fea6a5   11 months ago   13.3kB
只显示镜像ID

docker images -q

[root@VM-16-17-centos ~]# docker images -q
7df808544cb3
b866c2266fa5
5e9f874f2d50
50fe74b50e0d
3218b38490ce
feb5d9fea6a5
eec289123412
61c10eaefbcf
b1526c8ed2ad
d23bdf5b1b1b
显示镜像完整ID

docker images --no-trunc

[root@VM-16-17-centos ~]# docker images --no-trunc
REPOSITORY                            TAG              IMAGE ID                                                                  CREATED         SIZE
hello-world                           latest           sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412   11 months ago   13.3kB
过滤查询镜像

dangling(布尔值,true 或者 false),查询所有悬空的镜像,也就是tag是none的;
label(label=<key>或者label=<key>=<value>);
before(<image-name>[:<tag>], <image id> 或者<image@digest>),筛选在给定镜像之前创建的镜像;
since(<image-name>[:<tag>], <image id> 或者<image@digest>),筛选再给定镜像之后创建的镜像;
reference,筛选引用与给定镜像相匹配的镜像;

## 查询悬空的镜像
docker images -f "dangling=true"
## 查询标签是com.example.version的镜像
docker images -f "label=com.example.version"
## 查询标签是com.example.version并且版本为1.0镜像
docker images -f "label=com.example.version=1.0"
## 筛选在kfmirrors.io/datamining:117镜像之前创建的镜像
docker images -f "before=kfmirrors.io/datamining:117"
## 筛选在kfmirrors.io/datamining:115镜像之后创建的镜像
docker images -f "since=kfmirrors.io/datamining:115"
## 筛选与给定参考相匹配的镜像, 镜像名中存在/的是无法匹配的
docker images -f=reference='*datamining*:*libc'
格式化输出查询镜像

docker images -f 或者docker images --format

占位符 描述
.ID 镜像ID
.Repository 镜像名
.Tag 镜像标签
.Digest 镜像摘要
.CreatedSince 自创建镜像以来的时间
.CreatedAt 镜像创建的时间
.Size 镜像大小
# 1.
[root@VM-16-17-centos ~]# docker images --format "{{.ID}}:{{.Repository}}"
feb5d9fea6a5:hello-world

# 2.以表格的形式显示镜像ID、镜像名和镜像标签
[root@VM-16-17-centos ~]# docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"
IMAGE ID       REPOSITORY                            TAG
50fe74b50e0d   nginx                                 1.20.2
3218b38490ce   mysql                                 8.0.27
feb5d9fea6a5   hello-world                           latest
查看帮助文档

docker images --help

[root@VM-16-17-centos ~]# docker images --help

Usage:  docker images [OPTIONS] [REPOSITORY[:TAG]]

List images

Options:
  -a, --all             Show all images (default hides intermediate images)
      --digests         Show digests
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print images using a Go template
      --no-trunc        Don't truncate output
  -q, --quiet           Only show image IDs
搜索镜像

docker search imageName

–filter=STARS=3000 #过滤搜索出来的镜像的收藏(STARS)就是大于3000

[root@VM-16-17-centos ~]# docker search mysql
NAME                            DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                           MySQL is a widely used, open-source relation…   13115     [OK]   
mariadb                         MariaDB Server is a high performing open sou…   5013      [OK]   
phpmyadmin                      phpMyAdmin - A web interface for MySQL and M…   622       [OK]   
percona                         Percona Server is a fork of the MySQL relati…   584       [OK]   
bitnami/mysql                   Bitnami MySQL Docker Image                      76                   [OK]
[root@VM-16-17-centos ~]# docker search mysql --filter=STARS=200
NAME         DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql        MySQL is a widely used, open-source relation…   13115     [OK]   
mariadb      MariaDB Server is a high performing open sou…   5013      [OK]   
phpmyadmin   phpMyAdmin - A web interface for MySQL and M…   622       [OK]   
percona      Percona Server is a fork of the MySQL relati…   584       [OK] 
拉取镜像

docker pull 镜像名:镜像版本 (如果不加版本,就默认下载最新版本)

删除镜像

docker rmi 镜像id

查看镜像详细信息inspect

docker inspect 镜像ID/镜像名字

commit

提交容器作为镜像的版本

# 命令 sudo docker commit 提交容器成为一个新的副本
sudo docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
# 默认的tomcat下目录的webapps里面没有文件,需要先拷贝webapps.dist里面的文件到webapps里面
root@d2aff1f52d9e:/usr/local/tomcat# cp -r webapps.dist/* webapps
# 提交镜像 sudo docker commit  -a="xieqimeng" -m="xieqimeng"  d2aff1f52d9e tomcat02:1.0
[xqm@centOS7 ~]$ sudo docker commit  -a="xieqimeng" -m="xieqimeng"  d2aff1f52d9e tomcat02:1.0
sha256:b887da955baf18e6ac10f6ba1ba12e9113aea076ba9bc93cc89c901bfa8cd701
[xqm@centOS7 ~]$ sudo docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
tomcat02              1.0                 b887da955baf        6 seconds ago       653MB  #出现了提交的镜像
tomcat                latest              625b734f984e        10 days ago         648MB
centos                latest              0d120b6ccaa8        2 months ago        215MB
# 通过commit命令提交我们自己的镜像,以后就用自己修改过的镜像
# 如果你想保存当前容器的状态,就可以通过commit来提交,获得一个镜像,就好比学习VM的时候的快照!

镜像讲解

镜像是什么

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
所有的应用,直接打包成docker镜像,就可以直接跑起来。

镜像加载的原理

UnionFS(联合文件系统)
Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union文件系统是docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:
一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

DOcker镜像加载原理
   docker镜像实际上由一层一层的文件系统组成,这种层级的文件系统是UnionFS。
   bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统。在Docker镜像的最底层是bootfs,这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核,当boot加载完成之后整个内核就都在内存中,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
   黑屏---- 加载-----开机进入系统
   rootfs(root file system),在bootfs之上,包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

image.png

平时我们安装进虚拟机的CentOS都是好几个G,为什么Docker这里才200M?

对于一个精简的OS,rootfs可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的Linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以共用bootfs.

镜像分层原理

所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。
举一个简单的例子,假如基于Ubuntu Linux16.04创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加Python包,就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层。
该镜像当前已经包含3个镜像层,如下图所示:

image.png

在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合。下图举一个简单的例子,每个镜像层包含3个文件,而镜像包含了来自两个镜像层的6个文件。

image.png

下图展示了一个稍微复杂的三层镜像,在外部看来整个镜像只有6个文件,这是因为最上层中的文件7是文件5的一个更新版本。

image.png

这种情况下,上层镜像层中的文件覆盖了底层镜像中的文件,这样就使得文件中的更新版本作为一个新镜像添加到镜像当中。
Docker通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。
Linux上可用的存储引擎有AUFS、Overlay2、Device Mapper、Btrfs以及ZFS。顾名思义,每种存储引擎都基于Linux中对应的文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。
Docker在windows上仅支持windowsfilter一种存储引擎,该引擎基于NTFS文件系统之上实现了分层和CoW。
下图展示了与系统显示相同的三层镜像,所有镜像层堆叠并合并,对外提供统一的视图。

image.png

Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部 !这一层就是我们通常说的容器层,容器之下的都叫镜像层。

docker容器

容器命令

启动容器

docker run [可选参数] 镜像

#参数说明
--name="Name"   给容器命名
-d              后台的方式运行
-it             交互的方式运行,进入容器查看内容
-P(大写的P)      随机指定容器的端口 
-p(小写的p)      手动指定端口
	-p ip:8080:8080 ip地址:主机端口:容器端口  
	-p 8080:8080 主机端口:容器端口  (常用的)
	-p 8080     容器端口
docker run -it --name="mysql8.0" -p 3306:3306  mysql /bin/bash
列出容器

列出所有容器:docker ps -a

列出启动的容器:docker ps

退出容器

exit

删除容器
#删除单个容器  docker rm 容器ID,不能删除正在运行的容器,如果要强制删除,使用 rm -f
#删除所有容器  docker rm -f $(sudo docker ps -aq)  先查询所有容器id,再递归删除
#删除所有容器  docker ps -a -q|xargs docker rm 
启动、停止、重启容器

docker start/stop/restart 容器ID

后台启动容器

docker run -d 容器ID

查看容器运行的日志

docker logs -f --tail 100 容器ID

查看容器进程信息

docker top 容器ID

[root@VM-16-17-centos ~]# docker top redis
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
polkitd             16671               16652               0                   Jun29               ?                   01:35:40            redis-server 0.0.0.0:6379
查看容器的元数据inspect

docker inspect 容器ID

docker inspect 容器ID | grep Mounts -A 50 (展示从Mounts开始的后面50行)

docker inspect --format=“{{json .Mounts}}” 容器ID (以json格式展示Mounts中内容)

或者使用jq来美化json

yum -y install jq

docker inspect --format=“{{json .Mounts}}” 容器ID | jq

进入容器

docker exec -it 容器ID /bin/bash

docker attach 容器ID

#docker exec  进入容器后开启一个终端,可以在里面操作(常用)
#docker attach 进入容器正在执行的终端,不会启动新的进程
容器拷贝

容器内文件拷贝到主机

docker cp 容器id:容器内路径 目的主机路径

docker cp ec34ca6aa52e:/home/test.java /home

主机文件拷贝到容器内

docker cp 目的主机路径 容器id:容器内路径

容器数据卷

什么是容器数据卷?
docker理念:将应用和环境打包成一个镜像!
那么数据应该存放在哪?如果把数据存放在容器中,那么如果我们将容器一删除,数据也会丢失。#  需求:数据可以持久化!!!
比如有MySQL容器,删除这个容器就相当于删库。 #  需求:MySQL数据可以存储在本地!
#容器之间可以有一个数据共享的技术!将Docker容器中产生的数据,同步到本地,这就是卷技术!
#目录的挂载,将容器内的目录,挂载到Linux上面。
# 总结:卷技术就是为了容器的持久化和同步操作!容器之间也是可以数据共享的!
使用容器数据卷?

1.直接使用命令-v来挂载

sudo docker run -v 主机目录:容器内目录
# 进入容器中
[xqm@centOS7 /]$ sudo docker run -it -v /home/ceshi:/home centos /bin/bash
[root@f45eb02d8ef5 /]#   
#查看是否挂载成功
[xqm@centOS7 home]$ sudo docker inspect f45eb02d8ef5
# 出现mounts字段即代表成功
"Mounts": [                               #将资源映射到/home/ceshi目录
            {
                "Type": "bind",
                "Source": "/home/ceshi",  # 主机地址
                "Destination": "/home",   #docker内容器地址
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

以后只要在修改本地的文件,容器内的文件会自动同步

2.使用DockerFile来进行挂载

dockerFile就是用来构建docker镜像的构建文件!就是一个命令脚本!通过这个脚本可以生成一个镜像,镜像是一层一层的,因此脚本是一个一个的命令,每个命令都是一层。

#创建一个文件,名字随意,但是最好叫dockerfile
[root@centOS7 docker-test-volume]# pwd    #查看路径
/home/docker-test-volume
[root@centOS7 docker-test-volume]# vim dockerfile1
#在创建的文件中输入脚本内容,dockerfile脚本内容(脚本中的命令都是大写的):
FROM centos
VOLUME ["volume01","volume02"]

CMD echo "----end----"
CMD /bin/bash
#查看文件的内容
[root@centOS7 docker-test-volume]# cat dockerfile1 
FROM centos
VOLUME ["volume01","volume02"]

CMD echo "----end----"
CMD /bin/bash
#进行build,切记最后有一个点
[root@centOS7docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile1 -t xieqm/centos:1.0 .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
 ---> 0d120b6ccaa8
Step 2/4 : VOLUME ["volume01","volume02"]
 ---> Running in 071a37031bfc
Removing intermediate container 071a37031bfc
 ---> 3ebcb77525d2
Step 3/4 : CMD echo "----end----"
 ---> Running in e0c35e7d7cad
Removing intermediate container e0c35e7d7cad
 ---> bde88ab36146
Step 4/4 : CMD /bin/bash
 ---> Running in 5aa29e3bf5b9
Removing intermediate container 5aa29e3bf5b9
 ---> 1f51538e2ab5
Successfully built 1f51538e2ab5
Successfully tagged xieqm/centos:1.0
#查看是否生成镜像
[root@centOS7 docker-test-volume]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
xieqm/centos        1.0                 1f51538e2ab5        12 minutes ago      215MB
#启动镜像
[root@centOS7 docker-test-volume]# docker run -it 1f51538e2ab5 /bin/bash

查看目录,最下面目录就是生成镜像的时候自动挂载的数据卷目录:

image.png

这个卷和外部一定有一个同步的目录!

查看外部同步路径:

[root@centOS7 /]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
9e200475c1e4        1f51538e2ab5        "/bin/bash"              45 minutes ago      Up 45 minutes                               pensive_curie
79725421e740        nginx               "/docker-entrypoint.…"   5 hours ago         Up 5 hours          0.0.0.0:32769->80/tcp   nginx02
25cf85189243        nginx               "/docker-entrypoint.…"   5 hours ago         Up 5 hours          0.0.0.0:32768->80/tcp   nginx01
[root@centOS7 /]# docker inspect 9e200475c1e4

image.png

数据卷容器

多个mysql同步数据

image.png

#启动三个容器,通过自己写的容器启动

启动第一个容器

image.png

启动第二个容器

image.png

测试1,在docker01上创建文件,docker02上也同步:

image.png

测试2,新建docker03,在docker03上创建文件,在docker01上也同样存在

image.png

通过–volume-from 实现容器间的数据共享!!

#测试,可以删除docker01,来查看docker02和docker03是否还可以访问这个文件
#结果:依旧可以访问

具名挂载和匿名挂载
#匿名挂载,在进行卷映射的时候,命令中只写了容器的路径,没有主机的路径
-v 容器内路径    #不加上主机的路径,代表随机生成
docker run -d -P(大写的P代表随机端口) --name nginx01 -v /etc/nginx nginx
#启动容器
[xqm@centOS7 ~]$ sudo docker run -d -P --name nginx01 -v /etc/nginx nginx
25cf8518924303dc5d0bb85fda422612e50d56534c22831be065f9efe4b9bcc5
#查看卷相关的命令
[xqm@centOS7 ~]$ sudo docker volume --help

Usage:	docker volume COMMAND

Manage volumes

Commands:
  create      Create a volume
  inspect     Display detailed information on one or more volumes
  ls          List volumes
  prune       Remove all unused local volumes
  rm          Remove one or more volumes

Run 'docker volume COMMAND --help' for more information on a command.
#列出所有的卷,VOLUME NAME为一长串代码,没有具体的名字,因此是匿名挂载
[xqm@centOS7 ~]$ sudo docker volume ls
DRIVER              VOLUME NAME
local               3aeea3c1247dcec0db1c3d4afcc2a062aba0e21fbc22b885ac3a524f0b94ba8f   #匿名卷挂载
local               9173800c8a73d12f072cac8be551b0dcb9b6d34a44f9084da764d04d42f25b2c
# 具名挂载  通过命令:-v 卷名:容器内路径
[xqm@centOS7 ~]$ sudo docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
79725421e740f550909e688a94130e9433d4b81912f9bef2fc598da3d8184b53
#列出所有的卷,里面出现了具名的卷
[xqm@centOS7 ~]$ sudo docker volume ls
DRIVER              VOLUME NAME
local               3aeea3c1247dcec0db1c3d4afcc2a062aba0e21fbc22b885ac3a524f0b94ba8f
local               9173800c8a73d12f072cac8be551b0dcb9b6d34a44f9084da764d04d42f25b2c
local               juming-nginx   #具名挂载,即VOLUME NAME是自己起的名字

#查看具名挂载的详细信息
[xqm@centOS7 ~]$ sudo docker volume inspect juming-nginx 
[
    {
        "CreatedAt": "2020-11-03T09:35:42+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data", ### 挂载点
        "Name": "juming-nginx",
        "Options": null,
        "Scope": "local"
    }
]

所有docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/xxxxx/_data

# 使用sudo su或sudo -i命令切换到root
[xqm@centOS7 lib]$ sudo su  
[root@centOS7 lib]# cd docker
[root@centOS7 docker]# ls
builder  buildkit  containers  image  network  overlay2  plugins  runtimes  swarm  tmp  trust  volumes
[root@centOS7 docker]# cd volumes #查看卷下的内容
[root@centOS7 volumes]# ls
3aeea3c1247dcec0db1c3d4afcc2a062aba0e21fbc22b885ac3a524f0b94ba8f  juming-nginx
9173800c8a73d12f072cac8be551b0dcb9b6d34a44f9084da764d04d42f25b2c  metadata.db

通过具名挂载可以很容易的找到一个卷,大多数情况下使用的 具名挂载

怎么确定是具名挂载还是匿名挂载,还是指定路径挂载!
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /主机路径:容器内路径 #指定路径挂载

 #通过-v 容器内路径 ro/rw 来改变读写权限
 ro:readOnly 只读
 rw:readWrite 可读可写
 #一旦设置容器权限,容器对挂载出来的内容就有限定了
 sudo docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
 sudo docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
 #只要看到ro,说明这个路径只能通过宿主机来操作改变,容器内部是无法改变的

docker底层原理

docker是怎么工作的?

Docker是一个client-Server结构的系统,Docker的守护进程运行在主机上,通过socket从客户端访问。
Docker-Server接收到Docker-Client的指令,就会执行这个命令。

image.png

docker为什么比VM快?

  • 1.Docker有着比虚拟机更少的抽象层,由于Docker不需要Hypervisor实现硬件资源虚拟化,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源,因此在Cpu、内存利用率上Docker将会在效率上有明显优势。
  • 2.Docker利用的是宿主机的内核,而不需要Guest OS,因此,当新建一个容器时,Docker不需要和虚拟机一样重新加载一个操作系统,避免了引导、加载操作系统内核这个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,这个新建过程是分钟级别的,而Docker由于直接利用宿主机的操作系统则省略了这个过程,因此新建一个Docker容器只需要几秒钟。

image.png

Docker容器 虚拟机(VM)
操作系统 与宿主机共享OS 宿主机OS上运行宿主机OS
存储大小 镜像小,便于存储与传输 镜像庞大(vmdk等)
运行性能 几乎无额外性能损失 操作系统额外的cpu、内存消耗
移植性 轻便、灵活、适用于Linux 笨重、与虚拟化技术耦合度高
硬件亲和性 面向软件开发者 面向硬件运维者

DockerFile

介绍

dockerFile是用来构建docker镜像的文件!命令参数脚本!

构建步骤:

  1. 编写一个dockerFile文件
  2. docker build构建成为一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像 (发布到dockerHub或者阿里云镜像仓库)

很多官方镜像都是基础包,很多功能都没有,我们通常会搭建自己的镜像。

构建过程

基础知识

1.每个保留关键字(指令)都必须是大写字母

2.从上到下顺序执行

3.#表示注释

4.每一个指令都会创建一个新的镜像层,并提交

dockerFile是面向开发的,以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件很简单。

步骤:开发、部署、运维

DockerFile:是一个构建文件,定义了一切的步骤,类似于源代码。

DockerImages:通过DockerFile构建生成的镜像,就是最终发布和运行的产品。

Docker容器:容器就是镜像运行起来提供服务的

编写dockerfile文件,官方命名Dockerfile,build的时候就不需要-f,会自动寻找dockerfile文件

DockerFile的基本构成

  • 基础镜像信息
  • 维护者信息
  • 镜像操作指令
  • 容器启动时执行指令

DockerFile指令

  • 构建类指令

    • 用于构建image
    • 其指定的操作不会在运行image的容器上执行(FROM、MAINTAINER、RUN、ENV、ADD、COPY)
  • 设置类指令

    • 用于设置image的属性
    • 其指定的操作将在运行image的容器中执行(CMD、ENTRYPOINT、USER 、EXPOSE、VOLUME、WORKDIR、ONBUILD)
FROM             #基础镜像,一切从这里开始构建
MAINTAINER       #镜像是谁写的,姓名+邮箱
RUN              #镜像构建的时候需要运行的命令
ADD              #步骤:需要tomcat镜像的时候,添加tomcat压缩包,添加内容。
WORKDIR          #镜像的工作目录
VOLUME           #设置卷,挂载主机目录
EXPOSE           #指定暴露端口
CMD              #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT       #指定这个容器启动的时候要运行的命令,可以追加命名
ONBUILD          #当构建一个被继承DockerFile,这个时候就会运行ONBUILD的指令。就相当于一个触发指令
COPY             #类似ADD,将文件拷贝到镜像中
ENV              #构建的时候设置环境变量
指令 描述
FROM 构建新镜像基于的基础镜像
LABEL 标签
RUN 构建镜像时运行的Shell命令
COPY 拷贝文件或目录到镜像中
ADD 解压压缩包并拷贝
ENV 设置环境变量
USER 为RUN、CMD和ENTRYPOINT执行命令指定运行用户
EXPOSE 声明容器运行的服务端口
WORKDIR 为RUN、CMD、ENTRYPOINT、COPY和ADD设置工作目录
CMD 运行容器时默认执行,如果有多个CMD指令,最后一个生效

详细介绍:

1.FROM

FROM指令用于指定其后构建新镜像所使用的基础镜像。

FROM指令必是Dockerfile文件中的首条命令。

FROM指令指定的基础image可以是官方远程仓库中的,也可以位于本地仓库,优先本地仓库。

格式:FROM <image>:<tag>
例:FROM centos:latest

2.RUN

RUN指令用于在构建镜像中执行命令,有以下两种格式:

  • shell格式
格式:RUN <命令>
例:RUN echo 'kubemsb' > /var/www/html/index.html
  • exec格式
格式:RUN ["可执行文件", "参数1", "参数2"]
例:RUN ["/bin/bash", "-c", "echo kubemsb > /var/www/html/index.html"]

注意: 按优化的角度来讲:当有多条要执行的命令,不要使用多条RUN,尽量使用&&符号与\符号连接成一行。因为多条RUN命令会让镜像建立多层(总之就是会变得臃肿了😃)。

RUN yum install httpd httpd-devel -y
RUN echo test > /var/www/html/index.html
可以改成
RUN yum install httpd httpd-devel -y && echo test > /var/www/html/index.html
或者改成
RUN yum install httpd httpd-devel -y  \
    && echo test > /var/www/html/index.html

3.CMD

CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。

格式有三种:
CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2

每个Dockerfile只能有一条CMD命令。如果指定了多条命令,只有最后一条会被执行。

如果用户启动容器时候指定了运行的命令,则会覆盖掉CMD指定的命令。

4.EXPOSE

EXPOSE指令用于指定容器在运行时监听的端口

格式:EXPOSE <port> [<port>...]
例:EXPOSE 80 3306 8080

上述运行的端口还需要使用docker run运行容器时通过-p参数映射到宿主机的端口.

5.ENV

ENV指令用于指定一个环境变量.

格式:ENV <key> <value> 或者 ENV <key>=<value>
例:ENV JAVA_HOME /usr/local/jdkxxxx/

6.ADD

ADD指令用于把宿主机上的文件拷贝到镜像中

格式:ADD <src> <dest>
<src>可以是一个本地文件或本地压缩文件,还可以是一个url,
如果把<src>写成一个url,那么ADD就类似于wget命令
<dest>路径的填写可以是容器内的绝对路径,也可以是相对于工作目录的相对路径

7.COPY

COPY指令与ADD指令类似,但COPY的源文件只能是本地文件

格式:COPY <src> <dest>

8.ENTRYPOINT

ENTRYPOINT与CMD非常类似

相同点:
一个Dockerfile只写一条,如果写了多条,那么只有最后一条生效
都是容器启动时才运行

不同点:
如果用户启动容器时候指定了运行的命令,ENTRYPOINT不会被运行的命令覆盖,而CMD则会被覆盖

格式有两种:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2

9.VOLUME

VOLUME指令用于把宿主机里的目录与容器里的目录映射.

只指定挂载点,docker宿主机映射的目录为自动生成的。

格式:VOLUME ["<mountpoint>"]

10.USER

USER指令设置启动容器的用户(像hadoop需要hadoop用户操作,oracle需要oracle用户操作),可以是用户名或UID

USER daemon
USER 1001

注意:如果设置了容器以daemon用户去运行,那么RUN,CMD和ENTRYPOINT都会以这个用户去运行**
**镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户

11.WORKDIR

WORKDIR指令设置工作目录,类似于cd命令。不建议使用 RUN cd /root ,建议使用WORKDIR

WORKDIR /root

1

实战测试

编写DockerFile文件

# 1.编写配置文件
[root@centOS7 home]# mkdir dockerFile
[root@centOS7 home]# ls
ceshi  dockerFile  docker-test-volume  mysql  test.java  xqm  xqm.java
[root@centOS7 home]# cd dockerFile
[root@centOS7 dockerFile]# ls
[root@centOS7 dockerFile]# vim mydockerfileCentos
[root@centOS7 dockerFile]# cat mydockerfileCentos 
FROM centos
MAINTAINER xieqm<2874967@qq.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 "-----END-----"
CMD /bin/bash

构建镜像

# 2.通过这个文件构建镜像( -f:文件名,-t:镜像名)
[root@centOS7 dockerFile]# docker build -f mydockerfileCentos -t mydockerfilecentos:0.1 .
   # 结果
   Sending build context to Docker daemon  2.048kB
Step 1/10 : FROM centos
 ---> 0d120b6ccaa8
Step 2/10 : MAINTAINER xieqm<2874967@qq.com>
 ---> Using cache
 ---> e3806467e2be
Step 3/10 : ENV MYPATH /usr/local
 ---> Using cache
 ---> 3d0cf5f8ac3b
Step 4/10 : WORKDIR $MYPATH
 ---> Using cache
 ---> 2c7057e974c3
Step 5/10 : RUN yum -y install vim
 ---> Using cache
 ---> e09c999dbe51
Step 6/10 : RUN yum -y install net-tools
 ---> Running in 368b173037eb
Last metadata expiration check: 0:06:06 ago on Mon Nov 16 02:17:58 2020.
Dependencies resolved.
Installed:
  net-tools-2.0-0.51.20160912git.el8.x86_64   

Complete!
Removing intermediate container 368b173037eb
 ---> d2cbfb3114cc
Step 7/10 : EXPOSE 80
 ---> Running in 552d1370dc6c
Removing intermediate container 552d1370dc6c
 ---> 9fd3fe3312e5
Step 8/10 : CMD echo $MYPATH
 ---> Running in 1f4fe51dee68
Removing intermediate container 1f4fe51dee68
 ---> 830e7784f7df
Step 9/10 : CMD echo "-----END-----"
 ---> Running in bb6342887f4b
Removing intermediate container bb6342887f4b
 ---> cdc300075b37
Step 10/10 : CMD /bin/bash
 ---> Running in ff449bbe5e5b
Removing intermediate container ff449bbe5e5b
 ---> b6b78cfbc46d
Successfully built b6b78cfbc46d
Successfully tagged mydockerfilecentos:0.1

测试运行

# 3.测试运行
[root@centOS7 dockerFile]# docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
mydockerfilecentos   0.1                 b6b78cfbc46d        9 minutes ago       295MB
[root@centOS7 dockerFile]# docker run -it mydockerfilecentos:0.1
[root@b3779afdd8e2 local]# pwd    # 打印工作目录
/usr/local

查看当前镜像怎么构成

# 4.可以查看当前镜像是怎么构建的(docker history 镜像名)
root@centOS7 dockerFile]# docker history b6b78cfbc46d
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
b6b78cfbc46d        40 minutes ago      /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B  
cdc300075b37        40 minutes ago      /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B  
830e7784f7df        40 minutes ago      /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B  
9fd3fe3312e5        40 minutes ago      /bin/sh -c #(nop)  EXPOSE 80                    0B  
d2cbfb3114cc        40 minutes ago      /bin/sh -c yum -y install net-tools             22.9MB  
e09c999dbe51        46 minutes ago      /bin/sh -c yum -y install vim                   57.3MB  
2c7057e974c3        46 minutes ago      /bin/sh -c #(nop) WORKDIR /usr/local            0B  
3d0cf5f8ac3b        46 minutes ago      /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B  
e3806467e2be        46 minutes ago      /bin/sh -c #(nop)  MAINTAINER xieqm<2874967@…   0B  
0d120b6ccaa8        3 months ago        /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B  
<missing>           3 months ago        /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B  
<missing>           3 months ago        /bin/sh -c #(nop) ADD file:538afc0c5c964ce0d…   215MB  

CMD和ENTRYPOINT的区别

CMD              #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代(运行容器的时候追加的命令会替换之前的命令)
ENTRYPOINT       #指定这个容器启动的时候要运行的命令,可以在后面追加命名

测试CMD

# 测试CMD
# 1.创建一个测试的dockerfile
[root@centOS7 dockerFile]# vim dockerfile-cmd-test
[root@centOS7 dockerFile]# cat dockerfile-cmd-test 
FROM centos
CMD ["ls","-a"]
# 2.运行新建的dockerfile
[root@centOS7 dockerFile]# docker build -f dockerfile-cmd-test -t cmdtest .
Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM centos
 ---> 0d120b6ccaa8
Step 2/2 : CMD ["ls","-a"]
 ---> Running in b7731ff0a85c
Removing intermediate container b7731ff0a85c
 ---> 9b1b499e3f7c
Successfully built 9b1b499e3f7c
Successfully tagged cmdtest:latest
# 3.run运行镜像,发现ls -a命令生效
[root@centOS7 dockerFile]# docker run 9b1b499e3f7c
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
# 4.再次进行run,后面追加-l命令,实际运行会报错
[root@centOS7 dockerFile]# docker run 9b1b499e3f7c -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\": executable file not found in $PATH": unknown.
ERRO[0000] error waiting for container: context canceled 
# 原因:cmd的清理下,-l命令替换了CMD ["ls","-a"]命令,因为-l不是合法命令,因此报错

测试ENTRYPOINT

#测试ENTRYPOINT
# 1.创建dockerfile文件,并构建镜像
[root@centOS7 dockerFile]# vim docker-cmd-entrypoint
[root@centOS7 dockerFile]# docker build -f docker-cmd-entrypoint -t entrypoint-test .
Sending build context to Docker daemon  4.096kB
Step 1/2 : FROM centos
 ---> 0d120b6ccaa8
Step 2/2 : ENTRYPOINT ["ls","-a"]
 ---> Running in 368937b3b9d3
Removing intermediate container 368937b3b9d3
 ---> 61d979d10a56
Successfully built 61d979d10a56
Successfully tagged entrypoint-test:latest
# 2.运行镜像
[root@centOS7 dockerFile]# docker run 61d979d10a56
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
# 3.追加命令,发现可以运行不报错
[root@centOS7 dockerFile]# docker run 61d979d10a56 -l
total 0
drwxr-xr-x.   1 root root   6 Nov 16 05:54 .
drwxr-xr-x.   1 root root   6 Nov 16 05:54 ..
-rwxr-xr-x.   1 root root   0 Nov 16 05:54 .dockerenv
lrwxrwxrwx.   1 root root   7 May 11  2019 bin -> usr/bin
drwxr-xr-x.   5 root root 340 Nov 16 05:54 dev
drwxr-xr-x.   1 root root  66 Nov 16 05:54 etc
drwxr-xr-x.   2 root root   6 May 11  2019 home
lrwxrwxrwx.   1 root root   7 May 11  2019 lib -> usr/lib
lrwxrwxrwx.   1 root root   9 May 11  2019 lib64 -> usr/lib64
drwx------.   2 root root   6 Aug  9 21:40 lost+found
drwxr-xr-x.   2 root root   6 May 11  2019 media
drwxr-xr-x.   2 root root   6 May 11  2019 mnt
drwxr-xr-x.   2 root root   6 May 11  2019 opt
dr-xr-xr-x. 332 root root   0 Nov 16 05:54 proc
dr-xr-x---.   2 root root 162 Aug  9 21:40 root
drwxr-xr-x.  11 root root 163 Aug  9 21:40 run
lrwxrwxrwx.   1 root root   8 May 11  2019 sbin -> usr/sbin
drwxr-xr-x.   2 root root   6 May 11  2019 srv
dr-xr-xr-x.  13 root root   0 Nov 16 01:22 sys
drwxrwxrwt.   7 root root 145 Aug  9 21:40 tmp
drwxr-xr-x.  12 root root 144 Aug  9 21:40 usr
drwxr-xr-x.  20 root root 262 Aug  9 21:40 var

实战:tomcat镜像

准备

准备镜像文件tomcat压缩包,jdk压缩包

image.png

DockerFile文件

编写dockerfile文件,官方命名Dockerfile,build的时候就不需要-f,会自动寻找dockerfile文件

FROM centos
MAINTAINER xieqm<2874967992@qq.com>
COPY readme.txt /usr/local/readme.txt

ADD jdk-8u121-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.22.tar.gz /usr/local/

RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVAHOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.22
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/
 
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /url/local/apache-tomcat-9.0.22/bin/logs/catalina.out

构建镜像

# docker build -t diytomcat .

运行镜像

docker run -d -p 9090:8080 --name xieqmtomcat -v  /home/xieqm/build/tomcat/test:/usr/local/apache-tomcat-9.0.22/webapps/test -v /home/xieqm/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.22/logs diytomcat

进入容器

# docker exec -it 容器id bin/bash 

访问测试

 curl localhost:9090

1

docker操作

docker上传镜像

docker 上传镜像到镜像仓库(docker hub中)

创建仓库

docker hub 个人仓库:https://hub.docker.com/

创建私人仓库 docker push xingkongzhixia12138/service:tagname

上传

1.切换标签

docker tag 要上传镜像名 xingkongzhixia12138/service:标签

解释:将要上传的镜像重新打包一份,然后换个tag

2.登录docker hub

docker login

输入用户名和密码

3.上传镜像

docker push 刚才重新打包的镜像名:标签

4.完整过程

[root@VM-4-9-centos ~]# docker images
REPOSITORY       TAG       IMAGE ID       CREATED        SIZE
halohub/halo     1.5.3     f21e4e7f346e   3 months ago   346MB
service-common   latest    c48d7bf0edd2   4 months ago   889MB
redis            6.0.16    5e9f874f2d50   8 months ago   112MB
nginx            1.20.2    50fe74b50e0d   8 months ago   141MB
mysql            8.0.27    3218b38490ce   8 months ago   516MB
java             8         d23bdf5b1b1b   5 years ago    643MB
[root@VM-4-9-centos ~]# docker tag service-common:latest xingkongzhixia12138/service:v1.0

[root@VM-4-9-centos ~]# docker images
REPOSITORY                    TAG       IMAGE ID       CREATED        SIZE
halohub/halo                  1.5.3     f21e4e7f346e   3 months ago   346MB
service-common                latest    c48d7bf0edd2   4 months ago   889MB
xingkongzhixia12138/service   v1.0      c48d7bf0edd2   4 months ago   889MB
redis                         6.0.16    5e9f874f2d50   8 months ago   112MB
nginx                         1.20.2    50fe74b50e0d   8 months ago   141MB
mysql                         8.0.27    3218b38490ce   8 months ago   516MB
java                          8         d23bdf5b1b1b   5 years ago    643MB

[root@VM-4-9-centos ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: xingkongzhixia12138
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
[root@VM-4-9-centos ~]# docker push xingkongzhixia12138/service:v1.0 
The push refers to repository [docker.io/xingkongzhixia12138/service]
39f488feb289: Pushed 
35c20f26d188: Mounted from library/java 
c3fe59dd9556: Mounted from library/java 
6ed1a81ba5b6: Mounted from library/java 
a3483ce177ce: Mounted from library/java 
ce6c8756685b: Pushed 
30339f20ced0: Pushed 
0eb22bfb707d: Pushed 
a2ae92ffcd29: Mounted from library/java 
v1.0: digest: sha256:94620db6f670338add8a97f099969b00115663c4f0073cacf1ca308d2b170841 size: 2213

docker拉取镜像

docker pull 镜像名:标签

// 拉取上传私人仓库的镜像,需要登录 docker login
docker pull xingkongzhixia12138/service:tagname

docker安装mysql

查找安装的镜像

https://hub.docker.com/_/mysql?tab=tags

安装

docker pull mysql:8.0.27

创建一个容器并启动

( $PWD是当前目录,所以要先创建挂载的目录)

这是3306

docker run -p 3306:3306 --name mysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=xqm@123456 --privileged=true -d mysql:8.0.27

这是3307

docker run -p 3307:3307 --name mysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=xqm@123456 --privileged=true -d mysql:8.0.27

查看占用的端口号的PID

netstat -tanlp

换端口号

因为这里的端口号改变成了 3307,不是默认的3306,所以在本地目录(不是容器内)$PWD/conf内新建my.cnf文件,加上:

[mysqld]

port=3307

federated

max_connections = 200

max_allowed_packet = 64M

报错的时候刷新权限

mysql -uroot -p

输入密码

mysql> grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
mysql> flush privileges;

docker安装redis

拉取镜像

docker pull redis:6.0.16

创建redis.conf文件

将自己的配置文件复制过去

学习-markdown-redis.conf

创建容器并进行挂载

docker run -d --privileged=true -p 6379:6379 --restart always -v $PWD/conf/redis.conf:/etc/redis/redis.conf -v $PWD/data:/data --name redis redis:6.0.16 /etc/redis/redis.conf --appendonly yes

使用redis控制台

docker exec -it  容器ID redis-cli

docker安装nginx

拉取

docker pull nginx:1.20.2

生成容器

必须新建四个目录

/usr/local/software/nginx/conf

/usr/local/software/nginx/conf.d

/usr/local/software/nginx/log

/usr/local/software/nginx/html

在conf目录下新建nginx.conf文件

/usr/local/software/nginx/conf/nginx.conf 文件

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
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;
}

新建存放前端的目录

/usr/local/software/dist

上传下载目录

/usr/local/software/file/

其他软件接入nginx样例

server {
        listen       8188;

        server_name  localhost;

        #charset koi8-r;

            location /pm/ {
        alias      /usr/share/nginx/html/pm/dist/;
        index     index.html index.htm;
        try_files $uri $uri/ /pm/index.html;
    }

        location /api/ {
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass       http://127.0.0.1:9777/api/;
    }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

生成容器命令

docker run --name nginx -d --net=host -v /usr/local/software/nginx/log:/var/log/nginx -v /usr/local/software/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /usr/local/software/nginx/conf.d:/etc/nginx/conf.d -v /usr/local/software/dist:/usr/share/nginx/html -v /usr/local/software/file/:/usr/local/software/file --privileged=true nginx:1.20.2 

查看nginx映射目录

docker inspect nginx | grep Mounts -A 20

docker安装SVN

1.安装svn

yum install -y subversion

2.查看svn安装版本

svnserve --version

3.创建svn库文件夹

mkdir /usr/local/software/svn/project/study

4.创建snv库

svnadmin create /usr/local/software/svn/project/study

5.修改配置文件

千万注意,配置文件每一行前面不能有空格

cd /usr/local/software/svn/project/study/conf
vim svnserve.conf
#匿名访问的权限,可以是read、write、none,默认为read,在此因为我要建立我团队的私人版本库,故我设置为none
anon-access=none
#使授权用户有写权限,参数也是如上3个
auth-access=write
#使用哪个文件作为账号文件,在此指定在conf文件里面的另外一个文件passwd
password-db=passwd
#使用哪个文件作为权限文件,在此指定在conf文件里面的另外一个文件authz
authz-db=authz
#认证命名空间,说白了就是版本库的所在目录
realm=/usr/local/sofeware/svn/project/study

6.设置账户

主要是group下

### This file is an example authorization file for svnserve.
### Its format is identical to that of mod_authz_svn authorization
### files.
### As shown below each section defines authorizations for the path and
### (optional) repository specified by the section name.
### The authorizations follow. An authorization line can refer to:
###  - a single user,
###  - a group of users defined in a special [groups] section,
###  - an alias defined in a special [aliases] section,
###  - all authenticated users, using the '$authenticated' token,
###  - only anonymous users, using the '$anonymous' token,
###  - anyone, using the '*' wildcard.
###
### A match can be inverted by prefixing the rule with '~'. Rules can
### grant read ('r') access, read-write ('rw') access, or no access
### ('').

[aliases]
# joe = /C=XZ/ST=Dessert/L=Snake City/O=Snake Oil, Ltd./OU=Research Institute/CN=Joe Average

[groups]
# harry_and_sally = harry,sally
# harry_sally_and_joe = harry,sally,&joe

# [/foo/bar]
# harry = rw
# &joe = r
# * =
[/]
root=rw

# [repository:/baz/fuz]
# @harry_and_sally = rw
# * = r

7.设置密码

### This file is an example password file for svnserve.
### Its format is similar to that of svnserve.conf. As shown in the
### example below it contains one section labelled [users].
### The name and password for each user follow, one account per line.

[users]
# harry = harryssecret
# sally = sallyssecret
root=自定义自己的密码

8.启动svn

svnserve -d -r /usr/local/software/svn/project

9.查看svn启动情况

netstat -apn | grep 3690
ps -ef  | grep svnserve

10.关闭svn

killall svnserve

11.配置文件

/etc/sysconfig/svnserve

12.查看和配置svn的根路径

cat /etc/sysconfig/svnserve

13.开机自启动

systemctl enable svnserve.service

14.访问

因为启动的是/…/svn/project,那么访问就是以/…/svn/projetc为根目录进行访问
svn:/ip:3690/study

容器自启动

设置容器自启动 docker update --restart=always "容器名称"
取消容器自启动 docker update --restart=no "容器名称"

生成后端容器命令

/usr/local/software/file:存放的是上传下载的文件目录

8888端口是后端启动的端口

docker run -d -p 8888:8888 -e SERVICE_JAR_FILE=spring.jar  -v /usr/local/software/jar/spring.jar:/usr/local/software/jar/spring.jar -v /usr/local/software/file:/usr/local/software/file  --name spring-platform service-common --privileged=true

生成统一镜像

Dockerfile文件

# 指定基础镜像为java8:latest版本
FROM java:8
# 镜像维护者信息
#MAINTAINER xieqm <2874967992@qq.com>
#使用手动指定来暴露端口-p 80:80
#EXPOSE 9666
# 设置环境变量
ENV SERVICE_JAR_FILE ${SERVICE_JAR_FILE}
# 将本地文件添加到容器,生成容器的时候使用
ADD $SERVICE_JAR_FILE $SERVICE_JAR_FILE
# 在镜像容器中执行命令
RUN bash -c "touch /${SERVICE_JAR_FILE}"
ENTRYPOINT ["/bin/sh","-c","java -jar /usr/local/software/jar/${SERVICE_JAR_FILE}"]

docker build -t 镜像名字:镜像版本 .

结尾一定要加个.,代表当前目录