目录
5.3DockerFile部署一个简单的SpringBoot项目
一,简介
1.1 什么是虚拟化
在计算机中,虚拟化(Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部分是不受现有资源的架构方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。
在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件。对资源充分利用虚拟化技术种类很多,例如:软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化(vip)、桌面虚拟化、服务虚拟化、虚拟机等等。
1.2 什么是 Docker
-
Docker 是一个开源项目,诞生于2013年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议。
-
Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc。Redhat 已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中广泛应用
-
Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。Docker 的基础是 Linux 容器(LXC)等技术
-
在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单
1.3 为什么选择Docker?
(1)更高效的利用系统资源
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往以及运行更多数量的应用
(2)更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大节约了开发、测试、部署的时间
(3)一致的运行环境
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些bug并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用环境一致性,从而不会再出现【这段代码在机器上没问题啊】这类问题
(4)持续交付和部署
-
对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行
-
使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署,开发人员可以通过 Dockerfile 来进行镜像构建,并结合持续集成(Continuous Integration)系统进行集成测试,而运维人员则可以直接在生产环境中快速部署改镜像,甚至结合持续部署(Continuous Delivery/Deployment)系统进行自动部署
-
使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像
(5)更轻松的迁移
由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易地将在有个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况
(6)更轻松的维护和扩展
Docker 使用的分层存储已经镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大大降低了应用服务的镜像制作成本
1.4 容器与虚拟机的比较
-
容器是在操作系统层面上进行虚拟操作,直接复用本地主机的操作系统,而传统方式则是在硬件层面进行实现
-
与传统的虚拟机相比,Docker 优势体现为启动速度快、占用体积小
特性 | 容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
硬盘内存占用 | 一般为MB | 一般为GB |
性能 | 接近原生 | 弱于原生 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
二,Docker 组件
2.1 Docker 服务器与客户端
Docker 是一个客户端-服务器(C/S)架构程序。Docker 客户端只需要向 Docker 服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。Docker 提供了一个命令行工具 Docker 以及一整套 RESTful API。你可以在同一台宿主机上运行 Docker 守护进程和客户端,也可以从本地的 Docker 客户端连接运行在另一台宿主机上的远程 Docker 守护进程。
2.2 Docker 镜像与容器
镜像是构建 Docker 的基石。用于基于镜像来运行自己的容器。镜像也是 Docker 生命周期中的“构建”部分。镜像是基于联合文件系统的一种层式结构,由一系列指令一步一步构建出来,例如:
-
添加一个文件
-
执行一个命令
-
打开一个窗口
也可以将镜像当作容器的“源代码”。镜像体积很小,非常“便携”,易于分享、存储和更新
Docker 可以帮助你构建和部署容器,你只需要把自己的应用程序或者服务打包放进容器即可。容器是基于镜像启动起来的,容器中可以运行一个或多个进程。我们可以认为,镜像是Docker 生命周期中的构建或者打包阶段,而容器则是启动或者执行阶段。容器基于镜像启动,一旦容器启动完成后,我们就可以登录到容器中安装自己需要的软件或者服务,所以Docker 容器就是:
-
一个镜像格式
-
一些列标准操作
-
一个执行环境
Docker 借鉴了标准集装箱的概念。标砖集装箱将货物运往世界各地,Docker 将这个模型运用到自己的设计中,唯一不同的是:集装箱运输货物,而Docker 运输软件
和集装箱一样,Docker 在执行上述操作时,并不关心容器中到底装了什么,它不管是web服务器,还是数据库,或者是应用程序服务器什么的。所有的容器都按照相同的方式将内容“装载”进去
Docker 也不关心你要把容器运到何方:我们可以在自己的笔记本中构建容器,上传到Registry,然后下载到一个物理的或者虚拟的服务器来测试,再把容器部署到具体的主机中。就像标准集装箱一样,Docker 容器方便替换,可以叠加,易于分发,并且尽量通用
2.3 Registry(注册中心)
Docker 用 Registry 来保存用户构建的镜像。Registry 分为公共和私有两种。Docker 公司运营公共的 Registry 叫做 Docker Hub。用户可以在 Docker Hub 注册账号,分享并保存自己的镜像(说明:在Docker Hub 下载镜像很慢,可以自己构建私有的 Registry)
三,Docker安装
3.1官方安装脚本自动安装
安装命令如下:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
也可以使用国内daocloud一键安装命令:
curl -sSL https://get.daocloud.io/docker | sh
3.2手动安装
3.2.1更新yum
yum update
3.2.2卸载旧版本
如果存在较旧版本的docker或者docker-engine,需要先进行卸载这些程序再进行安装。
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
3.2.3设置仓库
在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库。安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
3.2.4设置yum源为阿里云
由于官方源地址安装及较慢,这里我推荐使用阿里云的源地址。
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.2.5安装 Docker
yum -y install docker-ce
3.2.6查看是否安装成功
[root@VM-12-4-centos ~]# docker -v
Docker version 20.10.21, build baeda1f
3.2.7设置加速镜像
由于docker的部分站点在国外,因此我们拉去一些镜像的时候可能出现速度很慢的情况,我们可以设置阿里云镜像加快镜像加载速度,顺便设置overlay2为默认存储驱动。进入docker的配置目录/etc/docker下的daemon.json,添加镜像加速地址。没有的话可以自己创建。
[root@localhost ~]#mkdir -p /etc/docker/
[root@localhost ~]#cat > /etc/docker/daemon.json <<EOF
>{
> "exec-opts": ["native.cgroupdriver=systemd"],
> "registry-mirrors": ["https://hjvrgh7a.mirror.aliyuncs.com"],
> "log-driver": "json-file",
> "log-opts": {
> "max-size": "100m"
> },
> "storage-driver": "overlay2"
>}
>EOF
设置docker开机启动,CentOS安装完成后docker需要手动设置docker命令补全
[root@localhost ~]#yum install -y epel-release bash-completion && cp /usr/share/bash-completion/completions/docker /etc/bash_completion.d/
[root@localhost ~]#systemctl enable --now docker
3.2.8启动docker并查看是否启动成功
#启动docker
[root@VM-12-4-centos docker]# systemctl start docker
#查看docker启动状态
[root@VM-12-4-centos docker]# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: active (running) since Fri 2022-12-09 11:00:50 CST; 6 days ago
Docs: https://docs.docker.com
Main PID: 26411 (dockerd)
Tasks: 36
Memory: 96.0M
CGroup: /system.slice/docker.service
├─26411 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.so...
├─31554 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 15672 -...
├─31562 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 15672 -conta...
├─31574 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 5672 -c...
└─31579 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 5672 -contai...
Dec 09 11:44:18 VM-12-4-centos dockerd[26411]: time="2022-12-09T11:44:18.789880226+08...g"
Dec 09 11:44:25 VM-12-4-centos dockerd[26411]: time="2022-12-09T11:44:25.480743526+08...e"
Dec 15 18:09:07 VM-12-4-centos dockerd[26411]: time="2022-12-15T18:09:07.991298350+08...93
Dec 15 18:09:08 VM-12-4-centos dockerd[26411]: time="2022-12-15T18:09:08.132854373+08...e"
Dec 15 18:13:17 VM-12-4-centos dockerd[26411]: time="2022-12-15T18:13:17.828377419+08...e"
Dec 15 18:13:17 VM-12-4-centos dockerd[26411]: time="2022-12-15T18:13:17.906215774+08...r"
Dec 15 18:13:17 VM-12-4-centos dockerd[26411]: time="2022-12-15T18:13:17.906257764+08:0...
Dec 15 18:16:57 VM-12-4-centos dockerd[26411]: time="2022-12-15T18:16:57.307115182+08...e"
Dec 15 18:16:57 VM-12-4-centos dockerd[26411]: time="2022-12-15T18:16:57.439192680+08...r"
Dec 15 18:16:57 VM-12-4-centos dockerd[26411]: time="2022-12-15T18:16:57.439229990+08:0...
Hint: Some lines were ellipsized, use -l to show in full.
#查看docker对应信息
[root@VM-12-4-centos docker]# docker info
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Docker Buildx (Docker Inc., v0.9.1-docker)
compose: Docker Compose (Docker Inc., v2.12.2)
scan: Docker Scan (Docker Inc., v0.21.0)
Server:
Containers: 2
Running: 1
Paused: 0
Stopped: 1
Images: 2
Server Version: 20.10.21
Storage Driver: devicemapper
Pool Name: docker-253:1-1311397-pool
Pool Blocksize: 65.54kB
Base Device Size: 10.74GB
Backing Filesystem: xfs
Udev Sync Supported: true
Data file: /dev/loop0
Metadata file: /dev/loop1
Data loop file: /var/lib/docker/devicemapper/devicemapper/data
Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
Data Space Used: 1.029GB
Data Space Total: 107.4GB
Data Space Available: 23.61GB
Metadata Space Used: 19MB
Metadata Space Total: 2.147GB
Metadata Space Available: 2.128GB
Thin Pool Minimum Free Space: 10.74GB
Deferred Removal Enabled: true
Deferred Deletion Enabled: true
Deferred Deleted Device Count: 0
Library Version: 1.02.170-RHEL7 (2020-03-24)
Logging Driver: json-file
Cgroup Driver: cgroupfs
Cgroup Version: 1
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
Default Runtime: runc
Init Binary: docker-init
containerd version: a05d175400b1145e5e6a735a6710579d181e7fb0
runc version: v1.1.4-0-g5fd4c4d
init version: de40ad0
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-1160.62.1.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 1.952GiB
Name: VM-12-4-centos
ID: EV3B:DGO7:VDHU:WZMU:55HW:K3NG:5BT3:3RQQ:GYNY:SXML:SOEK:YWOE
Docker Root Dir: /var/lib/docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
WARNING: the devicemapper storage-driver is deprecated, and will be removed in a future release.
WARNING: devicemapper: usage of loopback devices is strongly discouraged for production use.
Use `--storage-opt dm.thinpooldev` to specify a custom block storage device.
其他相关命令如下:
-
停止docker:systemctl stop docker
-
重启docker:systemctl restart docker
-
开机自启:systemctl enable docker
四,容器镜像的使用
4.1容器常用操作
4.1.1单独创建容器
docker create --name my_redis --expose 6379 redis:3.0.2
docker create [options] IMAGE
-
-a, --attach # 附加标准输出/错误
-
-i, --interactive # 附加标准输入(交互式)
-
-t, --tty # 伪终端 pseudo-tty
--name NAME # 命名你的镜像
-
-p, --publish 5000:5000 # 端口映射(主机:容器)
--expose 5432 # 向容器公开端口
-
-P, --publish-all # 发布所有端口
--link container:alias # 链接 linking
-
-v, --volume
pwd
:/app # mount(需要绝对路径) -
-e, --env NAME=hello # 环境变量 env vars
4.1.2后台创建和运行容器
docker run -d -p 80:80 docker/getting-started
-
-d
- 以分离模式运行容器 -
-p 80:80
- 将端口 80 映射到容器中的端口 80 -
docker/getting-started
- 要使用的镜像
4.1.3前台创建并运行容器
docker run -it -p --rm 8001:8080 --name my-nginx nginx
-
-it
- 交互式 bash 模式 -
--rm
- 容器终止运行后自动删除容器文件 -
-p 8001:8080
- 将8001
端口映射到容器中的8080
端口 -
--name my-nginx
- 指定名称 -
nginx
- 要使用的镜像
4.1.4容器的一般命令
#参数 <container> 可以是容器 id 或名称
docker ps #列出正在运行的容器
docker ps -a #列出所有容器
docker ps -s #列出正在运行的容器 (带 CPU / 内存)
docker exec -it <container> /bin/bash #连接到容器
docker logs <container> #显示容器的控制台日志
docker stop <container> #停止容器
docker restart <container> #重启一个容器
docker rm <container> #移除一个容器
docker port <container> #列出进程
docker kill <container> #杀死一个容器
docker rename oldname newname #重命名容器
4.1.5容器的启动与停止
#参数 <container> 可以是容器 id 或名称
docker start <container> #开始
docker stop <container> #停止
docker restart <container> #重启
docker pause <container> #暂停
docker unpause <container> #取消暂停
docker wait <container> #阻塞容器
docker attach <container> #连接到现有容器
4.1.6容器的说明操作
#参数 <container> 可以是容器 id 或名称
docker logs <container> #容器日志
docker inspect <container> #检查容器
docker events <container> #容器事件
docker port <container> #公共端口
docker top <container> #运行进程
docker stats <container> #容器资源使用
docker diff <container> #列出对容器所做的更改
4.2镜像常用操作
4.2.1查看镜像
[root@VM-12-4-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
rabbitmq management c8a49f166d2d 6 days ago 257MB
mysql 8.0 7484689f290f 2 weeks ago 538MB
-
REPOSITORY:镜像名称
-
TAG:镜像标签
-
IMAGE ID:镜像ID
-
CREATED:镜像的创建日期(不是获取该镜像的日期)
-
SIZE:镜像大小
这些镜像都是存储在Docker宿主机的var/lib/docker目录下。
4.2.2搜索镜像
[root@VM-12-4-centos ~]# docker search redis
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
redis Redis is an open source key-value store that… 11669 [OK]
bitnami/redis Bitnami Redis Docker Image 236 [OK]
redislabs/redisinsight RedisInsight - The GUI for Redis 75
redislabs/redisearch Redis With the RedisSearch module pre-loaded… 56
redislabs/rejson RedisJSON - Enhanced JSON data type processi… 51
redislabs/redis Clustered in-memory database engine compatib… 36
redis/redis-stack redis-stack installs a Redis server with add… 31
redislabs/redismod An automated build of redismod - latest Redi… 31 [OK]
redislabs/redisgraph A graph database module for Redis 25 [OK]
redislabs/rebloom A probablistic datatypes module for Redis 21 [OK]
redis/redis-stack-server redis-stack-server installs a Redis server w… 14
redislabs/redistimeseries A time series database module for Redis 12
redislabs/operator 7
redislabs/redis-py 5
redislabs/redisai 4
redislabs/redisgears An automated build of RedisGears 4
redislabs/redis-webcli A tiny Flask app to provide access to Redis … 3 [OK]
redislabs/redisml A Redis module that implements several machi… 2 [OK]
redislabs/k8s-controller 2
redislabs/operator-internal This repository contains pre-released versio… 1
redislabs/memtier_benchmark Docker image to run memtier_benchmark 0
redislabs/k8s-controller-internal 0
redislabs/olmtest Test artefact for OLM CSV 0
redislabs/olm-bundle 0
redislabs/ng-redis-raft Redis with redis raft module 0
-
NAME:镜像名称
-
DESCRIPTION:镜像的简单描述
-
STARS:星数,类似于GitHub
-
OFFICIAL:镜像是否为官方
-
AUTOMATED:镜像是否由dockerhub自动构建流程创建
4.2.3拉取镜像
#不加版本默认为最新版本
[root@VM-12-4-centos ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
025c56f98b67: Pull complete
ec0f5d052824: Pull complete
cc9fb8360807: Pull complete
defc9ba04d7c: Pull complete
885556963dad: Pull complete
f12443e5c9f7: Pull complete
Digest: sha256:ff5d8d8389474b6ad895ec6089e926711ce2af5939860488938f394298eedea9
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
[root@VM-12-4-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
rabbitmq management c8a49f166d2d 6 days ago 257MB
nginx latest 3964ce7b8458 7 days ago 142MB
4.2.4删除镜像
#一般后面跟镜像id或镜像名
[root@VM-12-4-centos ~]# docker rmi nginx
Untagged: nginx:latest
Untagged: nginx@sha256:ff5d8d8389474b6ad895ec6089e926711ce2af5939860488938f394298eedea9
Deleted: sha256:3964ce7b84589cf9bc585415741b642b7167229e0afde03f502f6c848ed3279d
Deleted: sha256:d074856927ea4224de9fa86b95620c7e4a26da5512db98ccd50cd31b972679a3
Deleted: sha256:815f0d9df09812d9a61725d270fc09f565ab24af22acbda11a953ac9740bb920
Deleted: sha256:dd1c6be5fb8e83f9dc81c628a614dee835cd881c1e244f7f893f2acc49c4fd3b
Deleted: sha256:1d76f7083f6e373335df2263cbd7e272c53df65f226bedbf4849149dddbfd9d7
Deleted: sha256:f95e777ae8eeb4c90475fda98d997771924baaf2975f406d62fa92a1a5b4e502
Deleted: sha256:b5ebffba54d3e3f7fd80435fcdc34c4a96fdb2ecab0f0a298fe08f74c2f69d29
[root@VM-12-4-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
rabbitmq management c8a49f166d2d 6 days ago 257MB
mysql 8.0 7484689f290f 2 weeks ago 538MB
删除所有镜像时可使用:
docker rmi $(docker images -q)
4.2.5镜像其他操作
$ docker load < ubuntu.tar.gz 镜像恢复与迁移
$ docker load -i ubuntu.tar 镜像恢复与迁移
$ docker save busybox > ubuntu.tar 镜像备份
$ docker history 显示镜像的历史
$ docker commit nginx mynginx 将容器另存为镜像。
$ docker tag nginx eon01/nginx 标记镜像
构建镜像时可使用:
$ docker build .
$ docker build github.com/creack/docker-firefox
$ docker build - < Dockerfile
$ docker build - < context.tar.gz
$ docker build -t eon/nginx-server .
$ docker build -f myOtherDockerfile .
$ curl example.com/remote/Dockerfile | docker build -f -
4.3容器与镜像的批操作
docker stop $(docker ps -a -q) #停止所有容器
docker rm -f $(docker ps -a -q) #删除所有容器
docker rmi -f $(docker images -q) #删除所有镜像
五,Dockerfile梳理
5.1基本概念
Dockerfile 是由一系列命令和参数构成的脚本,这些命令应用与基础镜像(操作级别的镜像,比如:centos镜像)并最终创建一个新的镜像
-
对于开发人员:可以为开发团队提供一个完全一致的开发环境
-
对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作
-
对于运维人员:在部署时,可以实现应用的无缝移植
5.2常用命令
命令 | 作用 |
---|---|
FROM image_name | 定义了使用哪个基础镜像启动构建流程(基础镜像要存在,若不存在,会优先pull基础镜像) |
MAINTAINER user_name | 声明镜像的创建者(非必须) |
ENV key value | 设置环境变量(可以写多条) |
RUN command | 是 Dockerfile 的核心部分(可以写多条) |
Add source_dir / file dest_dir / file | 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压 |
COPY source_dir / file dest_dir / file | 和 ADD 相似,但是如果有压缩文件不进行解压 |
WORKDIR path_dir | 设置工作目录 |
5.3DockerFile部署一个简单的SpringBoot项目
5.3.1整合后端成jar包并编写Dockerfile文件
#基础镜像使用的jdk版本
FROM openjdk:8
#作者
MAINTAINER young
#将所有的jar包整合为app.jar
COPY *.jar /app.jar
#指定容器启动时运行的命令
CMD ["--server.port=8090"]
#暴露后端后口号
EXPOSE 8090
#执行jar包
ENTRYPOINT ["java","-jar","/app.jar"]
5.3.2将jar包与Dockerfile文件上传至Liunx服务器
需要将这两个文件放在同级目录内
[root@VM-12-4-centos demo]# ll
total 36732
-rw-r--r-- 1 root root 289 Dec 21 16:24 Dockerfile
-rwxr-xr-x 1 root root 37605420 Dec 21 16:15 music-0.0.1-SNAPSHOT.jar
5.3.3构建镜像
#注意后面有一个点.别漏了
[root@VM-12-4-centos demo]# docker build -t mymusic .
Sending build context to Docker daemon 37.61MB
Step 1/6 : FROM openjdk:8
8: Pulling from library/openjdk
001c52e26ad5: Pull complete
d9d4b9b6e964: Pull complete
2068746827ec: Pull complete
9daef329d350: Pull complete
d85151f15b66: Pull complete
52a8c426d30b: Pull complete
8754a66e0050: Pull complete
Digest: sha256:86e863cc57215cfb181bd319736d0baf625fe8f150577f9eb58bd937f5452cb8
Status: Downloaded newer image for openjdk:8
---> b273004037cc
Step 2/6 : MAINTAINER young
---> Running in 3b03b6bb6c08
Removing intermediate container 3b03b6bb6c08
---> 0a8b8a80fa61
Step 3/6 : COPY *.jar /app.jar
---> 82a2213af05a
Step 4/6 : CMD ["--server.port=8081"]
---> Running in f51e7740441c
Removing intermediate container f51e7740441c
---> d9ce2e68fa52
Step 5/6 : EXPOSE 8081
---> Running in 5adcecedba6e
Removing intermediate container 5adcecedba6e
---> 01e09c92c563
Step 6/6 : ENTRYPOINT ["java","-jar","/app.jar"]
---> Running in b5c259a237aa
Removing intermediate container b5c259a237aa
---> 46adc3611f00
Successfully built 46adc3611f00
Successfully tagged mymusic:latest
这样我们后端项目就被构建成一个镜像了。
通过命令查看就能发现我们项目的镜像存在了。
[root@VM-12-4-centos demo]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mymusic latest 01eaf28f9fc7 About a minute ago 564MB
rabbitmq management c8a49f166d2d 6 days ago 257MB
mysql 8.0 7484689f290f 2 weeks ago 538MB
openjdk 8 b273004037cc 4 months ago 526MB
5.3.4创建运行容器并测试接口
[root@VM-12-4-centos demo]# docker run -d -p 8081:8081 --name mymusic1 mymusic
e6dcb57d899243795ea76ac9149b2a6a0f46a7a8378480d46f8b69ccb4fbdcdd
[root@VM-12-4-centos demo]# docker ps -s
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE
e6dcb57d8992 mymusic "java -jar /app.jar …" 10 seconds ago Up 5 seconds 0.0.0.0:8081->8081/tcp, :::8081->8081/tcp mymusic1 32.8kB (virtual 564MB)
a6f28deb93ee rabbitmq:management "docker-entrypoint.s…" 5 days ago Up 5 days 4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, :::5672->5672/tcp, 15671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp, :::15672->15672/tcp rabbit1 0B (virtual 257MB)
这样我们容器就顺利启动了,接下来可以测试一下我们后端接口。
[root@VM-12-4-centos data]# curl http://localhost:8081/singer
[{"id":1,"name":"张杰","sex":1,"pic":"/img/singerPic/zhangjie.jpg","birth":"1982-12-21 02:50:07","location":"中国四川","introduction":"华语歌坛新生代领军人物,偶像与实力兼具的超人气天王。2004年出道至今,已发行9张高品质唱片,唱片销量称冠内地群雄。2008年以来举办过9场爆满的个人演唱会,在各大权威音乐奖项中先后21次获得“最受欢迎男歌手”称号,2012年度中国TOP排行榜内地最佳男歌手,2010年在韩国M-net亚洲音乐大赏(MAMA)上获得“亚洲之星”(Best Asian Artist)大奖,影响力触及海外。"},{"id":2,"name":"周杰伦","sex":1,"pic":"/img/singerPic/zhoujielun.jpg","birth":"1979-01-09 01:29:15","location":"中国台湾","introduction":"著名歌手,音乐人,词曲创作人,编曲及制作人,MV及电影导演。新世纪华语歌坛领军人物,中国风歌曲始祖,被时代周刊誉为“亚洲猫王”,是2000年后亚洲流行乐坛最具革命性与指标性的创作歌手,亚洲销量超过3100万张……
可以看到接口测试正常。
六,Docker私有仓库搭建与配置
6.1拉取私有仓库镜像
[root@VM-12-4-centos data]# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
ca7dd9ec2225: Pull complete
c41ae7ad2b39: Pull complete
1ed0fc8a6161: Pull complete
21df229223d2: Pull complete
626897ccab21: Pull complete
Digest: sha256:ce14a6258f37702ff3cd92232a6f5b81ace542d9f1631966999e9f7c1ee6ddba
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest
[root@VM-12-4-centos data]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mymusic latest 2f0a4e6e04d7 2 hours ago 564MB
rabbitmq management c8a49f166d2d 6 days ago 257MB
mysql 8.0 7484689f290f 2 weeks ago 538MB
registry latest 81c944c2288b 5 weeks ago 24.1MB
openjdk 8 b273004037cc 4 months ago 526MB
6.2启动私有仓库容器
[root@VM-12-4-centos data]# docker run -id --name registry -p 5000:5000 registry
db84693c0bd7e2adde2b26bb09664ae971c567a53e01beab583f0613d16ee1e9
[root@VM-12-4-centos data]# docker ps -s
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE
db84693c0bd7 registry "/entrypoint.sh /etc…" 5 seconds ago Up 4 seconds 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp registry 0B (virtual 24.1MB)
a6f28deb93ee rabbitmq:management "docker-entrypoint.s…" 6 days ago Up 6 days 4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, :::5672->5672/tcp, 15671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp, :::15672->15672/tcp rabbit1 0B (virtual 257MB)
6.3查看搭建情况
[root@VM-12-4-centos data]# curl -X GET http://localhost:5000/v2/_catalog
{"repositories":[]}
记得开放防火墙端口,然后可以看到此时私有仓库已经搭建成功,并且没有内容。
6.4修改配置
修改daemin.json文件,让docker信任我们的私有仓库
{ "storage-driver": "devicemapper" ,
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
"insecure-registries": ["1:5000"]
}
~
然后重启docker服务,重新运行registry容器即可。
[root@VM-12-4-centos data]# systemctl restart docker
[root@VM-12-4-centos data]# docker start registry
registry
[root@VM-12-4-centos data]# docker ps -s
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE
db84693c0bd7 registry "/entrypoint.sh /etc…" 14 minutes ago Up 4 seconds 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp registry 0B (virtual 24.1MB)
6.5Docker私有仓库镜像上传
这里我们对之前的SpringBoot项目的景象进行上传。
标记我们之前的项目的镜像为私有仓库的镜像。
[root@VM-12-4-centos data]# docker tag mymusic 192.168.98.128:5000/mymusic
[root@VM-12-4-centos data]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.98.128:5000/mymusic latest 2f0a4e6e04d7 2 hours ago 564MB
mymusic latest 2f0a4e6e04d7 2 hours ago 564MB
rabbitmq management c8a49f166d2d 6 days ago 257MB
mysql 8.0 7484689f290f 2 weeks ago 538MB
registry latest 81c944c2288b 5 weeks ago 24.1MB
openjdk 8 b273004037cc 4 months ago 526MB
注意需将镜像名称重命名为:仓库ip+端口+镜像名称的形式。否则会push仓库不成功.
然后将标记后的镜像push到我们的私有仓库。
[root@VM-12-4-centos data]# docker push 43.142.85.155:5000/mymusic
Using default tag: latest
The push refers to repository [43.142.85.155:5000/mymusic]
22d537790a70:Pushed
cbdcc39a568b:Pushed
174f56854903: Pushed
latest:digest:sha256:0028c43cc9e8400bc4e7fbddc378b741516718ad8b72a12de0c4f38f107d0acb
size:949
搞定,然后重新刷新一下私有仓库地址,就可以看到镜像已经成功上传。
[root@VM-12-4-centos data]# curl -X GET http://localhost:5000/v2/_catalog
{"repositories":["mymusic"]}
七,其他一些总结
7.1Docker网络相关
#删除网络
docker network rm MyOverlayNetwork
#列出网络
docker network ls
#获取有关网络的信息
docker network inspect MyOverlayNetwork
#将正在运行的容器连接到网络
docker network connect MyOverlayNetwork nginx
#启动时将容器连接到网络
docker run -it -d --network=MyOverlayNetwork nginx
#断开容器与网络的连接
docker network disconnect MyOverlayNetwork nginx
7.2DockerHub相关
docker search search_word #在 docker hub 中搜索镜像。
docker pull user/image #从 docker hub 下载镜像。
docker login #向 docker hub 进行身份验证
docker push user/image #将镜像上传到 docker hub。
7.3Docker Compose相关
docker-compose up #创建和启动容器
docker-compose up -d #以分离模式创建和启动容器
docker-compose down #停止和删除容器、网络、映像和卷
docker-compose logs #查看容器的输出
docker-compose restart #重启所有服务
docker-compose pull #拉取所有服务的镜像
docker-compose build #构建所有服务的镜像
docker-compose config #验证并查看 Compose 文件
docker-compose scale <service_name>=<replica> #为服务指定容器个数
docker-compose top #显示正在运行的进程
docker-compose run -rm -p 2022:22 web bash #启动 Web 服务并运行 bash 作为其命令,删除旧容器。
7.4Docker Services相关
docker service create <options> <image> <command> #创建新服务
docker service inspect --pretty <service_name> #显示详细信息服务
docker service ls #列出服务
docker service ps #列出服务的任务
docker service scale <service_name>=<replica> #规模特殊服务
docker service update <options> <service_name> #更新服务选项
7.5Docker Stack相关
docker stack ls #列出此 Docker 主机上所有正在运行的应用程序
docker stack deploy -c <composefile> <appname> #运行指定的 Compose 文件
docker stack services <appname> #列出与应用关联的服务
docker stack ps <appname> #列出与应用关联的正在运行的容器
docker stack rm <appname> #拆掉一个应用程序
7.6Docker Machine相关
docker-machine create --driver virtualbox myvm1 #创建虚拟机(Mac、Win7、Linux)
docker-machine create -d hyperv --hyperv-virtual-switch "myswitch" myvm1 Win10
docker-machine env myvm1 #查看有关您的节点的基本信息
docker-machine ssh myvm1 "docker node ls" #列出集群中的节点
docker-machine ssh myvm1 "docker node inspect <node ID>" #检查节点
docker-machine ssh myvm1 "docker swarm join-token -q worker" #查看加入令牌
docker-machine ssh myvm1 #打开与 VM 的 SSH 会话; 输入“exit”结束
docker-machine ssh myvm2 "docker swarm leave" #让工人离开群体
docker-machine ssh myvm1 "docker swarm leave -f" #让主人离开,杀群
docker-machine start myvm1 #启动当前未运行的 VM
docker-machine stop $(docker-machine ls -q) #停止所有正在运行的虚拟机
docker-machine rm $(docker-machine ls -q) #删除所有虚拟机及其磁盘映像
docker-machine scp docker-compose.yml myvm1:~ #将文件复制到节点的主目录
docker-machine ssh myvm1 "docker stack deploy -c <file> <app>" #部署应用
更多Docker命令使用可以自行参考Docker命令使用清单
看到最后的小伙伴觉得不错的话欢迎点赞、收藏哈~