Docker学习笔记

docker

虚拟机配置网络

可以使用dhclient工具为虚拟机分配一个可用的ip

1
2
3
4
5
6
7
8
9
10
11
12
# 分配ip地址
dhclient

# 修改网络配置
vi /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROTO="static"
ONBOOT="yes"

# 添加如下配置
IPADDR=192.168.31.17 #注意这是分配的IP
GATEWAY=192.168.31.1
DNS1=119.29.29.29

一.修改网络配置:

  1. vi /etc/sysconfig/network-scripts/ifcfg-ens33
  2. 2.输入i进入编辑模式,将最后一行的ONBOOT=no改为ONBOOT=yes
  3. 按Esc键,输入“:wq!”,保存并退出
  4. 然后重启网络,输入service network restart
  5. 输入ip addr查看ip

Docker的历史

有意思的是,Docker 公司起初是一家名为 dotCloud 的平台即服务(Platform-as-a-Service, PaaS)提供商。

底层技术上,dotCloud 平台利用了 Linux 容器技术。为了方便创建和管理这些容器,dotCloud 开发了一套内部工具,之后被命名为“Docker”。Docker就是这样诞生的!

2013年,dotCloud 的 PaaS 业务并不景气,公司需要寻求新的突破。于是他们聘请了 Ben Golub 作为新的 CEO,将公司重命名为“Docker”,放弃dotCloud PaaS 平台,怀揣着“将 Docker 和容器技术推向全世界”的使命,开启了一段新的征程。

如今 Docker 公司被普遍认为是一家创新型科技公司,据说其市场价值约为 10 亿美元。Docker 公司已经通过多轮融资,吸纳了来自硅谷的几家风投公司的累计超过 2.4 亿美元的投资。

几乎所有的融资都发生在公司更名为“Docker”之后。

提示:“Docker”一词来自英国口语,意为码头工人(Dock Worker),即从船上装卸货物的人。

Docker能干嘛

之前的虚拟机技术

虚拟机缺点

  • 资源占用多
  • 冗余步骤多
  • 启动慢

容器化技术

容器化技术并不是一个完整的技术

一个容器包含了运行环境和应用,每个容器时互相隔离的,容器直接运行在操作系统之上,从分利用操作系统的资源。

Docker 是一个开源的应用容器引擎,基于Go语言并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

比较Docker和虚拟机不同:

  • 传统虚拟机,虚拟出一个硬件,运行一个完整的操作系统,在这个系统上安装和操作软件。
  • 容器内的应用直接运行在宿主机的内容,容器是没有内核的,也没有虚拟我们的硬件,所以是非常轻便的。
  • 没有容器间是相互隔离的,每个容器都有属于自己的文件系统,互不影响。

DevOps(开发、运维)

更快速的交付和部署。

更便捷的升级和扩缩容

更简单的系统运维。

更高效的计算机资源利用(Docker是内核级别的虚拟化)

Docker的基本组成

镜像(image)

镜像就是一个只读的模板,镜像可以用来创建Docker容器,一个镜像可以创建很多容器

容器(container)

Docker利用容器独立运行的一个或一组应用。容器是用镜像创建的运行实例。

它可以被启用,开始,停止,删除。每个容器都是相互隔离的,保证安全的平台。

可以把容器看作是一个简易版的Linux环境(包括root用户权限,进程空间,用户空间和网络空间等)和运行在其中的应用程序。

容器的定义和镜像几乎一摸一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的

仓库(repository)

仓库是集中存放镜像文件的场所。

仓库和仓库注册服务器(Registry)是有区别的,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签

仓库分为公开仓库(public)和私有仓库(private)两种形式

最大的开放仓库是Docker Hub: https://hub.docker.com/ 存放了数量庞大的镜像供用户下载。

国内的公开仓库包括阿里云,网易云等

安装Docker

查看系统内核

1
2
[root@MiWiFi-R4A-srv /]# uname -r
3.10.0-1062.el7.x86_64

查看系统版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@MiWiFi-R4A-srv /]# cat /etc/os-release 
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

卸载旧的版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 卸载旧版本
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine


# 需要的安装包
sudo yum install -y yum-utils

# 设置镜像的仓库
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 更新yum软件包索引
yum makecache fast

# 安装docker相关 docker-ce社区版 ee版企业版
sudo yum install docker-ce docker-ce-cli containerd.io

# 启动docker
sudo systemctl start docker

# 使用docker -version查看是否安装成功
docker -version

# hello world程序
docker run hello-world

# 查看镜像
[root@MiWiFi-R4A-srv ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest 6d15a1d68603 7 days ago 649MB
mysql 8.0.22 ab2f358b8612 8 days ago 545MB
mysql latest ab2f358b8612 8 days ago 545MB
redis latest ef47f3b6dc11 8 days ago 104MB
centos centos7 8652b9f0cb4c 5 weeks ago 204MB
hello-world latest bf756fb1ae65 11 months ago 13.3kB

卸载Docker

1
2
3
4
5
# 卸载依赖
$ sudo yum remove docker-ce docker-ce-cli containerd.io

# 删除资源
$ sudo rm -rf /var/lib/docker

阿里云镜像加速

1
2
3
4
5
6
7
8
9
10
11
sudo mkdir -p /etc/docker

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

sudo systemctl daemon-reload

sudo systemctl restart docker

底层原理

Docker是怎么工作的?

Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上, 然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。

DockerServer接收到Docker-Client的指令,就会执行这个命令。

为什么Docker比VM快?

  1. Docker有着虚拟机更少的抽象层,由于Docker不需要Hypervisor实现硬件资源虚拟化,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源,因此在CPU、内存利用率上Docker将会有明显优势。
  2. Docker利用的是宿主机的内核,而不需要GuestOS,因此,当新建一个容器时Docker不需要和虚拟机一样重新加载一个操作系统,避免了引导、加载操作系统内核这个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载GuestOS,这个新建过程是分钟级别的,而Docker由于直接利用宿主机的操作系统则省略了这个过程,因此新建一个Docker只需几秒钟。
Docker容器 虚拟机(VM)
操作系统 与宿主机共享OS 宿主机OS上运行宿主机OS
存储大小 镜像小,便于存储与传输 镜像庞大(vmdk等)
运行性能 几乎无额外性能损失 操作系统额外的cpu、内存消耗
移植性 轻便、灵活、适用于Linux 笨重、与虚拟化技术耦合度高
硬件亲和性 面向软件开发者 面向硬件运维者

Docker的常用命令

帮助命令

1
2
3
docker --version 	# 显示Docker的版本信息
docker info # 显示Docker的系统信息,包括镜像和容器的数量
docker --help # 帮助命令

镜像命令

1
2
3
docker images	# 查看本地所有镜像
docker images -a # 列出本地所有的镜像(含中间映像层)
docker images -q # 只显示id
1
2
docker search mysql		# 搜索镜像
docker search mysql --filter=STARS=3000 # 过滤只搜索3000satr以上的
1
2
docker pull mysql	# 如果不写tag,默认latest最新版
docker pull mysql:5.7 # 指定版本下载
1
docker rmi 697daaecf703		# Docker删除镜像

容器命令

有镜像才能创建容器,下载一个centos镜像来学习。

1
docker pull centos

新建容器并启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
docker run [可选参数] image

# 参数说明
--name="NAME" 容器名字,用来区别容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p -p 8080:8080
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
-P 随机指定端口


# 测试
docker run -it centos /bin/bash

# 从容器退回主机
exit

列出所有正在运行的容器

1
2
3
4
5
6
7
8
9
10
[root@MiWiFi-R4A-srv /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
581a17d041b4 centos "/bin/bash" 3 minutes ago Up 3 minutes nice_roentgen


docker ps -a # 列出所有容器

docker ps -a -n=1 # 显示最近创建的容器

docker ps -aq # 显示当前容器的编号

退出容器

1
2
exit  # 直接容器停止并退出
Ctrl + P + Q # 容器不停止退出

删除容器

1
2
docker rm 容器id		# 删除指定的容器,不能删除正在运行的容器
docker rm -f $(docker ps -ap) # 删除所有的容器

启动和停止容器操作

1
2
3
4
docker start容器id  # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止容器
docker kill 容器id #强制停止当前容器

常用其他命令

后台启动容器

1
2
3
docker run -d centos
# docker ps发现centos停止了
# 常见的坑,dokcer容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止

查看日志

1
docker logs -f -t --tail 容器id

查看容器中进程信息

1
2
3
[root@MiWiFi-R4A-srv ~]# docker top 847858ee8a4a
UID PID PPID C STIME TTY TIME CMD
root 5967 5947 0 22:28 ? 00:00:00 /bin/bash

查看镜像的元数据

1
docker inspect 847858ee8a4a

进入当前正在运行的容器

1
2
3
4
5
# 方式一  开启一个新的终端
docker exec -it 847858ee8a4a /bin/bash

# 方式二 执行正在运行的终端
docker attach 847858ee8a4a #正在执行当前的代码

从容器内部拷贝文件到主机上

1
2
3
4
docker cp 容器id:容器内路径 目的主机路径

# 将dockers内部/home下的zhang.java拷贝到主机的home
docker cp dc6084befe30:/home/zhang.java /home

练习

Docker安装nginx

1
2
3
4
5
6
# 搜索镜像
docker search nginx
# 下载镜像
docker pull nginx
# 运行镜像 -d后台运行 --name给容器命名 -p宿主机端口
docker run -d --name nginx01 -p 3344:80 nginx

Docker安装tomcat

1
2
# 官方的使用(-rm 用完及删除,用于测试)
docker run --rm tomcat:9.0

可视化

  • portainer

docker图形化管理工具

安装

1
2
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

访问测试

  • Rancher(CI/CD)

Docker镜像

镜像是什么

镜像是一个轻量级、可执行的的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的内容,包括代码,运行时库,环境变量和配置文件。

如何得到镜像呢?

  • 远程仓库下载
  • 拷贝
  • 自己制作一个镜像

Docker镜像加载原理

UnionFS(联合文件系统)

Union文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统时Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

Docker镜像的加载原理

docker 的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

bootfs(boot file system) 主要包含bootloader和kernel,bootloader 主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就存在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

roorfs (root file system),在bootfs之上。包含的就是典型Linux系统中的 /dev ,/proc,/bin ,/etx 等标准的目录和文件。rootfs就是各种不同的操作系统发行版。比如Ubuntu,Centos等等。

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

特点

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

Commit镜像

1
2
3
docker commit  # 提交容器成为一个新的版本

docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[tag]

实战测试

1
2
3
4
5
6
7
8
9
10
11
12
# 启动一个默认的tomcat
docker run -it -p 9999:9999 tomcat

# 发现这个tomcat,webapps下面时没有文件的
root@24cc7cd482ff:/usr/local/tomcat# cd webapps
root@24cc7cd482ff:/usr/local/tomcat/webapps# ls

# 自己拷贝进去基本的文件
root@24cc7cd482ff:/usr/local/tomcat# cp -r webapps.dist/* webapps

# 生成一个新镜像
docker commit -a="zhang" -m="add webapps app" 24cc7cd482ff tomcat02:1.0

这就是我们修改过的镜像

安装MySQL

mysql数据的持久化问题

1
2
3
4
5
6
7
8
9
[root@izbp13r5pmefkwfqgkx4i2z ~]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql01 mysql
e1911d0e9045f63df828e4639196ce32e1bf631e21df3c7fb789c487055d572b

# 启动mysql
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置 密码
--name 容器名称

测试连接

进入host的home目录,发现mysql目录,进入data目录可以看到数据。

我们利用本地navicat新建一个数据库,再次查看data目录下文件

发现多了test文件,说明映射的路径是ok的。

假设我们删除容器

发现数据并没消失

Dockerfile

dockerfile就是用来构建docker镜像的构建文件(命令脚本,通过这个脚本可以生成镜像)

1
2
3
4
5
# 创建一个dockerfile文件
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "------end--------"
CMD /bin/bash
1
docker build -f /home/docker-test-voume/dockerfile01 -t zhangdemo/centos:1.o .

启动自己的镜像

构建步骤

  1. 编写一个dokerfile文件
  2. docker build构建一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像

基础知识

  • 每个关键字都是大写
  • 执行从上到下的顺序
  • # 表示注释
  • 每一个指令都会创建提交一个新的镜像层,并提交

dockerfile是面向开发。Docker逐渐成为了企业交付的标准。

DockerFile的指令

1
2
3
4
5
6
7
8
9
10
11
12
FROM   		# 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的,姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤,tomcat镜像,这个tomcat的压缩包!添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录位置
EXPOST # 暴露端口
CMD # 指定容器启动时要输出的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定容器启动时要输出的命令,可以追加命令
ONBUILD # 当构建一个被继承DockerFile这个时候就会运行ONBUILD指令,触发指令。
COPY # 类似ADD命令,将文件拷贝到镜像中
ENV # 构建的时候设置环境变量

构建自己的Centos

1.编写dockerfile的配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#基于Centos
FROM centos

#告诉别人我是谁
MAINTAINER zhang<495726603@qq.com>

#环境变量
ENV MYPATH /usr/local

#工作目录
WORKDIR $MYPATH

#安装一个vim
RUN yum -y install vim

RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "-----end-------"

CMD /bin/bash

2.通过文件构建镜像

1
2
3
4
docker build -f mydockerfile -t mycentos:v1 .

# -f 代表dockerfile的文件路径
# -t 镜像名和版本号

3.测试运行

可以看到运行的工作目录为我们在dockerfile中配置的工作目录,

并且ifconfig命令可用了.

4.可以通过docker history 镜像id列出本地镜像的变更地址

CMD和ENTRYPOINT的区别

测试cmd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 编写dockerfile文件
vim dockerfile-cmd-test

FROM centos
CMD ["ls","-a"]

#构建镜像
docker build -f dockerfile-cmd-test -t cmdtest .

#run运行,发现我们的ls -a命令生效
[root@izbp13r5pmefkwfqgkx4i2z dockerfile]# docker run bef2698bd130
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media

#想追加一个命令 -l ls -al
[root@izbp13r5pmefkwfqgkx4i2z ~]# docker run bef2698bd130 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:370: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.

#cmd的情况下 -l替换了CMD["ls","-a"]命令 ,不是命令所以报错

测试entryporint(我们追加的命令,是直接在我们的entrypoint命令后面的)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
[root@izbp13r5pmefkwfqgkx4i2z ~]# vim dockerfile-cmd-entrypoint
[root@izbp13r5pmefkwfqgkx4i2z ~]# docker build -f dockerfile-cmd-entrypoint -t entorypoint-test .
Sending build context to Docker daemon 726kB
Step 1/2 : FROM centos
---> 300e315adb2f
Step 2/2 : ENTRYPOINT ["ls","-a"]
---> Running in 51ffcc67a242
Removing intermediate container 51ffcc67a242
---> 4645e2e60db1
Successfully built 4645e2e60db1
Successfully tagged entorypoint-test:latest
[root@izbp13r5pmefkwfqgkx4i2z ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
entorypoint-test latest 4645e2e60db1 15 seconds ago 209MB
cmdtest latest bef2698bd130 14 minutes ago 209MB
mycentos v1 ee0d621d29ee 2 hours ago 282MB
zhangdemo/centos 1.o 8bb60281dfef 4 hours ago 209MB
mysql latest a347a5928046 4 days ago 545MB
tomcat latest feba8d001e3f 8 days ago 649MB
redis latest ef47f3b6dc11 2 weeks ago 104MB
centos latest 300e315adb2f 2 weeks ago 209MB
portainer/portainer latest 62771b0b9b09 5 months ago 79.1MB
hello-world latest bf756fb1ae65 11 months ago 13.3kB
[root@izbp13r5pmefkwfqgkx4i2z ~]# docker run 4645e2e60db1
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
[root@izbp13r5pmefkwfqgkx4i2z ~]# docker run 4645e2e60db1 -l
total 56
drwxr-xr-x 1 root root 4096 Dec 26 13:15 .
drwxr-xr-x 1 root root 4096 Dec 26 13:15 ..
-rwxr-xr-x 1 root root 0 Dec 26 13:15 .dockerenv
lrwxrwxrwx 1 root root 7 Nov 3 15:22 bin -> usr/bin
drwxr-xr-x 5 root root 340 Dec 26 13:15 dev
drwxr-xr-x 1 root root 4096 Dec 26 13:15 etc
drwxr-xr-x 2 root root 4096 Nov 3 15:22 home
lrwxrwxrwx 1 root root 7 Nov 3 15:22 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64
drwx------ 2 root root 4096 Dec 4 17:37 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 15:22 media
drwxr-xr-x 2 root root 4096 Nov 3 15:22 mnt
drwxr-xr-x 2 root root 4096 Nov 3 15:22 opt
dr-xr-xr-x 90 root root 0 Dec 26 13:15 proc
dr-xr-x--- 2 root root 4096 Dec 4 17:37 root
drwxr-xr-x 11 root root 4096 Dec 4 17:37 run
lrwxrwxrwx 1 root root 8 Nov 3 15:22 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 3 15:22 srv
dr-xr-xr-x 13 root root 0 Dec 26 13:15 sys
drwxrwxrwt 7 root root 4096 Dec 4 17:37 tmp
drwxr-xr-x 12 root root 4096 Dec 4 17:37 usr
drwxr-xr-x 20 root root 4096 Dec 4 17:37 var

实战:Tomcat镜像

1.准备镜像文件,tomcat压缩包,tomcat依赖java,需要jdk

2.编写dockekfile文件。官方命名Dockerfile,使用这个就不需要加-f指定文件名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 基础镜像
FROM centos

MAINTAINER zhangliyuan<495726603@qq.com>

COPY readme.txt /tomcat/readme.txt

# 用add命令会自动帮我们解压
ADD jdk-11.0.8_linux-x64_bin.tar.gz /usr/local/

ADD apache-tomcat-9.0.41.tar.gz /usr/local/


# 安装vim
RUN yum -y install vim

# 环境变量
ENV MYPATH /usr/local

# 工作目录
WORKDIR $MYPATH

# java环境变量
ENV JAVA_HOME /usr/loacl/jdk11.0.8

ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

# 配置tomcat环境变量
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.41
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.41

ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

#暴露端口
EXPOSE 8080

# tomcat日志
CMD /usr/local/apache-tomcat-9.0.41/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.41/bin/logs/catalina.out

3.构建镜像

1
docker build -t diytomcat .

发布自己的镜像

DockerHub

登录dockerhub

login -u zhangliyuandocker```
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

增加一个tag

`docker tag a6c12980154f zhangliyuan/tomcat:1.0`

提交

`docker push zhangliyuan/tomcat:1.0`

![](https://cdn.jsdelivr.net/gh/zhangliyuangit/img/docker12272.png)





#### 阿里云

- 找到镜像容器服务
- 创建命名空间
- 创建容器镜像

![](https://cdn.jsdelivr.net/gh/zhangliyuangit/img/docker12273.png)





### Springboot项目打包

- 在idea中新建Dockerfile文件

```shell
FROM java:8

WORKDIR /app

COPY upload.jar .

CMD ["--server.port=8080"]


EXPOSE 8080

ENTRYPOINT java -jar upload.jar
  • 将Dockerfile和jar包用xftp上传到服务器

  • 构建镜像

docker build -t zhangupload .

  • 运行

docker run -d -P --name upload zhangupload

  • 测试

  • 查看日志

sudo docker logs -f -t --tail 行数 容器名

评论