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等等。
平时我们安装进虚拟机的CentOS都是好几个G,为什么Docker这里才200M?
对于一个精简的OS,rootfs可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的Linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以共用bootfs.
镜像分层原理
所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。
举一个简单的例子,假如基于Ubuntu Linux16.04创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加Python包,就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层。
该镜像当前已经包含3个镜像层,如下图所示:
在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合。下图举一个简单的例子,每个镜像层包含3个文件,而镜像包含了来自两个镜像层的6个文件。
下图展示了一个稍微复杂的三层镜像,在外部看来整个镜像只有6个文件,这是因为最上层中的文件7是文件5的一个更新版本。
这种情况下,上层镜像层中的文件覆盖了底层镜像中的文件,这样就使得文件中的更新版本作为一个新镜像添加到镜像当中。
Docker通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。
Linux上可用的存储引擎有AUFS、Overlay2、Device Mapper、Btrfs以及ZFS。顾名思义,每种存储引擎都基于Linux中对应的文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。
Docker在windows上仅支持windowsfilter一种存储引擎,该引擎基于NTFS文件系统之上实现了分层和CoW。
下图展示了与系统显示相同的三层镜像,所有镜像层堆叠并合并,对外提供统一的视图。
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
查看目录,最下面目录就是生成镜像的时候自动挂载的数据卷目录:
这个卷和外部一定有一个同步的目录!
查看外部同步路径:
[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
数据卷容器
多个mysql同步数据
#启动三个容器,通过自己写的容器启动
启动第一个容器
启动第二个容器
测试1,在docker01上创建文件,docker02上也同步:
测试2,新建docker03,在docker03上创建文件,在docker01上也同样存在
通过–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的指令,就会执行这个命令。
docker为什么比VM快?
- 1.Docker有着比虚拟机更少的抽象层,由于Docker不需要Hypervisor实现硬件资源虚拟化,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源,因此在Cpu、内存利用率上Docker将会在效率上有明显优势。
- 2.Docker利用的是宿主机的内核,而不需要Guest OS,因此,当新建一个容器时,Docker不需要和虚拟机一样重新加载一个操作系统,避免了引导、加载操作系统内核这个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,这个新建过程是分钟级别的,而Docker由于直接利用宿主机的操作系统则省略了这个过程,因此新建一个Docker容器只需要几秒钟。
Docker容器 | 虚拟机(VM) | |
---|---|---|
操作系统 | 与宿主机共享OS | 宿主机OS上运行宿主机OS |
存储大小 | 镜像小,便于存储与传输 | 镜像庞大(vmdk等) |
运行性能 | 几乎无额外性能损失 | 操作系统额外的cpu、内存消耗 |
移植性 | 轻便、灵活、适用于Linux | 笨重、与虚拟化技术耦合度高 |
硬件亲和性 | 面向软件开发者 | 面向硬件运维者 |
DockerFile
介绍
dockerFile是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
- 编写一个dockerFile文件
- docker build构建成为一个镜像
- docker run 运行镜像
- 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压缩包
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 镜像名字:镜像版本 .
结尾一定要加个.,代表当前目录