docker介绍
docker是一个开源的容器引擎,有助于更快的交付应用,docker可将应用程序和基础设施层隔离。使用docker可以更快的打包、测试以及部署应用程序,并可以缩短从编写到部署运行代码的周期
- docker daemon(docker守护进程)
docker daemon是一个运行在宿主机(DOCKER-HOST)的后台进程。可通过docker客户端与之通信 - client(docker客户端)
docker客户端是docker的用户界面,他可以接受用户命令和配置表示,并与docker daemon通信。 - registry(仓库)
docker registry是一个集中存储于分发镜像的服务。构建完docker镜像后,就可以在宿主机上运行,但如果要在其他机器上运行这个镜像,就需要手动复制。这时候就可以借助docker registry来避免镜像的手动复制。
一个docker registry可以包含多个docker仓库,每个仓库可以包含多个镜像标签,每个标签对应一个docker镜像。和maven的仓库类似。如果把docker registry比作maven仓库的话,那么docker仓库就可以理解为某个jar包的路径,而镜像标签可以理解为jar包的版本号 - images(docker 镜像)
docker镜像是一个只读模板,他包含创建docker容器的说明。他和系统安装官潘类似,使用系统安装光盘可以安装系统。同理,使用docker镜像可以运行docker镜像中的程序 - container(容器)
container容器时镜像的可运行实例。镜像和容器的关系类似于面向对象中,类和对象的关系。可以通过相关指令来启动、停止、移动、删除容器
docker安装
docker包含两个版本,社区版ce,企业版ee。下面介绍以社区版为例
以centos为例
1.docker要求centos内核版本高于3.10
2.查看内核版本
uname -r
3.确保yum包更新到最新
yum -y update
4.卸载旧版本
yum remove docker docker-common docker-selinux docker-engine
5.安装需要的软件包
yum install -y yum-utils device-mapper-persistent-data lvm2
6.设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新yum缓存 sudo yum makecache fast
7.查看所有仓库中的docker版本,并选择特定版本安装 (社区版)
yum list docker-ce --showduplicates | sort -r
8.安装docker
sudo yum install docker-ce #由于repo中默认只开启stable仓库,所以这里安装的是最新最稳定的版本
(指定安装某一版本)sudo yum install <FQPN> # 例如 sudo yum install docker-ce-19.03.8.ce
9.启动并加入开机启动
systemctl start docker
//查看进程里是否有docker了 ps -ef|grep docker
systemctl enable docker
10.验证安装是否成功(有client和service两部分表示安装成功)
docker version
11.卸载docker
yum -y remove docker-engine
需要配置镜像加速器
由于国内网络问题,需要配置加速器来加速。
借助阿里云的镜像加速器
cd /etc/docker 查看有没有daemon.ison。这是docker默认的配置文件
如果没有就新建,有则修改
vim daemon.json
{
"registry-mirrors":["https://m9r2r2uj.mirror.aliyuncs.com"]
}
ESC :wq保存退出
重启docker服务
service docker restart
docker官方的镜像仓库 https://hub.docker.com
12.搜索镜像
docker search java
docker search redis
docker search mysql
NAME:镜像仓库名称
DESCRIPTION:镜像仓库描述
STATUS:镜像仓库收藏数,表示该镜像仓库的受欢迎程度,类似于github的stars
OFFICAL:表示是否为官方仓库,[OK]的表示有官方维护
AUTOMETED:表示是否为自动构建的镜像仓库
13.下载镜像
docker pull java:8 (冒号后面指定版本)
14.列出镜像
docker images 列出已下载的镜像
PEPOSITORY:镜像所属仓库名称
TAG:镜像标签。默认latest,表示最新
IMAGE ID:镜像id,表示唯一标识
CREATED:镜像创建时间
SIZE:镜像大小
15.删除本地镜像
docker rmi 镜像id/名称
容器相关命令
1.新建并启动容器
使用以下命令docker run命令即可新建并启动一个容器,该命令是最常用的命令,他有很多选项,下面将列举一些常用的选项
-d选项:表示后台运行
-p选项:随机端口映射
-p选项:指定端口映射,有一下四种格式:
-- ip:hostPort:containerPort
-- ip:containerPort
-- hostPort:comtainerPort
-- containerPort
-network选项:指定网络模式,该选项有以下可选参数:
-- network=bridge:默认选项,表示连接到默认的网桥
-- network=host:容器使用宿主机的网络
-- network=container:NAME-or-ID:告诉docker让新建的容器使用已有容器的网络配置
-- network=none:不配置该容器的网络,用户可自定义网络配置
--name:指定容器名称
docker run -d -p 91:80 nginx
这样就能启动一个nginx容器。
这里为docker run添加了两个参数:
-d 后台运行
-p 宿主机端口:容器端口 #开放容器端口到宿主机端口
访问 http://docker宿主机ip:91/ ,将会看到nginx的主界面
(将软件镜像放入容器中运行,容器可以通过宿主机做一个端口的映射,91:80的映射,然后我们的client端就可以访问宿主机来访问所有的盒子容器。我们每个盒子都可以和宿主机做一个端口映射,让client去访问。然后就能对外提供服务了)
注意:使用docker run命令创建容器时,会先检查本地是否存在指定镜像。如果本地不存在该名称的镜像,docker就会自动从docker仓库下载镜像并启动一个docker容器
再开一个nginx
第一个启动的
2.列出容器
docker ps
命令可以列出运行中的容器,下面展示的是刚刚启动的两个
如果需要列出所有容器,包括已停止的容器,可使用-a参数。该列表包含7列,含义如下
-CONTAINER ID:表示容器id
-IMAGE:表示镜像名称
-COMMAND:表示启动容器时运行的命令
-CREATED:表示容器创建的时间
-STATUS:表示容器运行的状态。Up表示运行中,Exited表示已停止
-PORTS:表示容器对外的端口号
-NAMES:表示容器名称。该名称默认由docker生成,也可以使用docker run命令的–name自行指定。例如:
3.停止容器
docker stop 容器id/容器名称 (即可停止容器)
例如
docker stop 3511963ace8e
4.强制停止容器
可使用docker kill 命令发送 SIGKILL信号来强制停止容器
docker kill d00baaf7e05f
5.启动已停止的容器
使用docker run命令,即可新建并启动一个容器。
对于已经停止的容器,可使用docker start命令来启动
docker start b7231c7ef966
6.查看容器所有信息
docker inspect b7231c7ef966
[
{
"Id": "b7231c7ef966cf511920e63e865f8701f4fdbd62a71f12e4667b802de2ef8da7",
"Created": "2020-03-13T17:37:46.040094799Z",
"Path": "nginx",
"Args": [
"-g",
"daemon off;"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 30805,
"ExitCode": 0,
"Error": "",
"StartedAt": "2020-03-13T17:55:53.947286621Z",
"FinishedAt": "2020-03-13T17:38:13.248784122Z"
},
"Image": "sha256:6678c7c2e56c970388f8d5a398aa30f2ab60e85f20165e101053c3d3a11e6663",
"ResolvConfPath": "/var/lib/docker/containers/b7231c7ef966cf511920e63e865f8701f4fdbd62a71f12e4667b802de2ef8da7/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/b7231c7ef966cf511920e63e865f8701f4fdbd62a71f12e4667b802de2ef8da7/hostname",
"HostsPath": "/var/lib/docker/containers/b7231c7ef966cf511920e63e865f8701f4fdbd62a71f12e4667b802de2ef8da7/hosts",
"LogPath": "/var/lib/docker/containers/b7231c7ef966cf511920e63e865f8701f4fdbd62a71f12e4667b802de2ef8da7/b7231c7ef966cf511920e63e865f8701f4fdbd62a71f12e4667b802de2ef8da7-json.log",
"Name": "/laughing_moser",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "92"
}
]
},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": null,
"CapDrop": null,
"Capabilities": null,
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "private",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"ConsoleSize": [
0,
0
],
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": [],
"BlkioDeviceReadBps": null,
"BlkioDeviceWriteBps": null,
"BlkioDeviceReadIOps": null,
"BlkioDeviceWriteIOps": null,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DeviceCgroupRules": null,
"DeviceRequests": null,
"KernelMemory": 0,
"KernelMemoryTCP": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": null,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0,
"MaskedPaths": [
"/proc/asound",
"/proc/acpi",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/timer_list",
"/proc/timer_stats",
"/proc/sched_debug",
"/proc/scsi",
"/sys/firmware"
],
"ReadonlyPaths": [
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
},
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/445d7ed1ba6433220f530b0d63eceea9257d0568bf810ea150402122c8f46267-init/diff:/var/lib/docker/overlay2/ccb164893d31ec256890955c9a09c7c43619a74baee8308e3d4447683dbfdac4/diff:/var/lib/docker/overlay2/286329cd1ecd59046182f2712e921652488e8ef086e826a3f8c2a484801581db/diff:/var/lib/docker/overlay2/09535fe890e395fd50b3728fb1a2869cda03463776051218d428d73a786e0a97/diff",
"MergedDir": "/var/lib/docker/overlay2/445d7ed1ba6433220f530b0d63eceea9257d0568bf810ea150402122c8f46267/merged",
"UpperDir": "/var/lib/docker/overlay2/445d7ed1ba6433220f530b0d63eceea9257d0568bf810ea150402122c8f46267/diff",
"WorkDir": "/var/lib/docker/overlay2/445d7ed1ba6433220f530b0d63eceea9257d0568bf810ea150402122c8f46267/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "b7231c7ef966",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": true,
"AttachStderr": true,
"ExposedPorts": {
"80/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"NGINX_VERSION=1.17.9",
"NJS_VERSION=0.3.9",
"PKG_RELEASE=1~buster"
],
"Cmd": [
"nginx",
"-g",
"daemon off;"
],
"Image": "nginx",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
},
"StopSignal": "SIGTERM"
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "5f78b6ccb865270464560b95d74a48749c6df9c17a338bbd3928f5b0988aab9b",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
"80/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "92"
}
]
},
"SandboxKey": "/var/run/docker/netns/5f78b6ccb865",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "7c36781d5cb394bcf76aedcf7a30d627ee0f310dd0a5e31e50401228537f790f",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:03",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "37d16e5cef3ae8c18a1bef64c4ad1747d241f0131c8734aac70d4bd5bc5db400",
"EndpointID": "7c36781d5cb394bcf76aedcf7a30d627ee0f310dd0a5e31e50401228537f790f",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.3",//容器的ip
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:03",
"DriverOpts": null
}
}
}
}
]
使用浏览器是无法直接访问的
但是可以通过宿主机来curl一下,说明访问成功
7.查看容器日志
docker container logs b7231c7ef966
8.查看容器里的进程
docker top b7231c7ef966
9.进入容器
使用docker cintainer exec 命令用于进入一个正在运行的docker容器。如果docker run命令运行容器的时候。参数,就要用这个命令进入容器。一旦进入了容器,就可以在容器的shell执行命令
docker container exec -it b7231c7ef966 /bin/bash 进入该容器
exit 退出容器
9.删除容器
使用docker rm可以删除指定容器
.docker rm b7231c7ef966
该命令只能删除已停止的容器,如需要删除正在运行的容器,则需要使用-f参数
将微服务运行在docker上
使用Dockerfile构建Docker对象
Dockerfile是一个文本文件,其中包含了若干条指令,指令描述了构建镜像的细节
先来编写一个最简单的Dockerfile。以前面的nginx镜像为例,编写一个Dockerfile修改nginx镜像的首页
1、新建文件夹/app,在app目录下新建一个名为Dockerfile的文件,在里面添加一下内容
FROM nginx
RUN echo '<h1>欢迎来到LOL</h1>' > /usr/share/nginx/html/index.html
该命令非常简单,其中的FROM RUN都是Dockerfile的指令。FROM指令用于指定基础镜像,RUN执行命令
2、在Dockerfile所在路径执行一下命令构建镜像
docker build -t nginx:my_nginx .
其中,-t 指定镜像名字,命令最后的(.)表示Dockerfile文件所在的路径
3、执行以下命令,即可使用该镜像启动一个docker容器
docker run -d -p 95:80 nginx:my_nginx
4、访问http://docker宿主机ip:95/
使用Dockerfile构建微服务镜像
。。。未完待续
以一个可运行的jar包构建成docker镜像
1、将jar包上传linux服务器/app/test目录,在jar包所在目录创建名为Dockerfile的文件
2、在Dockerfile中添加以下内容
# 基于哪个镜像
From java:8
# 将本地文件夹挂载到当前容器
VOLUME /tmp
# 复制文件到容器
ADD xxx.jar(宿主机下你的jar包路径) /app.jar (容器下的路径)
# 声明需要暴露的端口(宿主机对外暴露的端口)
EXPOSE 你的端口号
# 配置容器启动后执行的命令
ENTRYPOINT ["java","-jar","/app.jar"]
3、使用docker build命令构建镜像
docker build -t 镜像名称:标签 Dockerfile文件的相对位置
docker build -t ruoyi-admin:0.0.1 .
在这里使用-t选项指定了镜像的标签。执行该命令后,终端将会输出以下内容:
4、启动镜像,加 -d 可以后台启动运行
docker run -p 8080:8080 ruoyi-admin:0.0.1
5、访问http://宿主机ip:8080/
DockerFile常用命令
命令 | 用途 |
---|---|
FROM | 基础镜像文件 |
RUN | 构建镜像阶段执行命令 |
ADD <src> <dest> | 添加文件,从src目录复制文件到容器的dest,其中src为dockerfile所在目录的相对路径,也可以是一个url,还可以是一个压缩包 |
COPY | 拷贝文件,和ADD命令类似,但不支持url和压缩包 |
CMD | 容器启动后执行命令 |
EXPOSE | 声明容器在运行时对外提供的服务端口 |
WORKDIR | 指定容器工作路径 |
ENV | 指定环境变量 |
ENTRYPOINT | 容器入口,ENTRYPOINT 和CMD 指令的目的一样,为docker容器启动时执行的命令,可多次设置,但只要最新有效 |
USR | 该指令用于设置启动镜像时的用户或者UID |
docker compose编排微服务做高可用