code monkey

导航

docker安装与镜像制作

上一篇文章帮助新手简单认识docker与虚拟机区别以及与咱们开发的微服务程序之间的联系。本篇就要实操一下如何安装docker,并且用docker来创建一下镜像并在其它机器使用。

考虑到java后端及运维常用linux系统,我后面都以 centos 7为例

1.安装docker

安装docker,官方Linux系统要求

1. 64位安装
2. 版本 3.10 或更高版本的 Linux 内核。建议使用适用于您的平台的最新版本的内核。
3. iptables 版本 1.4 或更高版本

docker一般要求服务器有网络,这样我们可以通过yum命令来安装

yum install docker  --安装
systemctl start docker  --启动
systemctl enable docker --设置为开机启动

如果离线安装docker,提前去官网下载一份docker安装包 , 放到服务器上, 地址 https://download.docker.com/

tar xzvf ./docker-*.tgz  -C ./    --解决docker包到当前目录
/bin/cp -rf ./docker/** /usr/bin/  --复制到 /usr/bin/ ,也可以创建软链,方便使用
dockerd  &     --后台运行守护程序

如下内核版本太低,可能会启动失败,请参考下面的方法来来升级您的 Linux 内核

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
yum --enablerepo=elrepo-kernel install kernel-ml

再编辑开机引导文件,将默认启动顺序设为最近的引导

vi /etc/default/grub

调整下面设置

GRUB_DEFAULT=0

保存后

grub2-mkconfig -o /boot/grub2/grub.cfg

重启再试基本上能解决。

2.制作一个镜像

上一篇我讲到过,docker如同虚拟机一样,可以在一个基础的系统上,安装好我们需要的工具,jdk环境,或者微服务程序,然后制作成一个镜像,等到要用的时候复制安装到本地。
怎么制作镜像呢,我们这样采用编写Dockerfile文件的形式来制作。
以创建一个nginx反射代理的前端网站为例,首先你创建一个命令为Dockerfile的文件,不要再格式后缀。
编码如下

FROM nginx:1.21.5   
USER root
COPY ./dist  /var/www
COPY ./nginx.conf  /etc/nginx/nginx.conf
EXPOSE 80
VOLUME  ["/etc/nginx/","/var/log/nginx","/var/www"]
ENTRYPOINT ["nginx", "-g", "daemon off;"]  

FROM表示从哪一个基础镜像开始,docker官方仓库提供了很多已做好的基础仓库,地址https://registry.hub.docker.com/search?q=&type=image
在这里插入图片描述
USER 表示在基础镜像中运行命令的用户身份,这里是root
COPY 表示将我本地的dist文件夹以及nginx.conf文件配置文件复制进镜像系统中的/var/www目录和/etc/nginx/目录中。
EXPOSE 仅表示我要80用到这个端口,宿主机把我制作好的镜像下载下来,不将这个端口映射出来 ,同样是无法使用的。 使用方法 docker run -p 80:80 .将宿主机的80端口映射到容器中的80端口
VOLUME 我们制作好镜像后,下载并创建成一个容器,由于之前我提过,容器与容器,容器与主机之前默认是独立,隔离,如果我运行的这个容器中有的文件我需要在宿主机看到,或者容器中的日志越来越多,导致容器越来越大,这样很不方便,通过VOLUME声明我需要将容器中/etc/nginx/,/var/www文件夹开放出来,我们后面叫做挂载,与EXPOSE声明端口不同,这里如果我们在创建容器时不主动挂载目录,它也会将这里声明的文件挂载到/var/lib/docker/volumes/[容器ID]/_data下面。
ENTRYPOINT 表示我在启动容器后,需要立马运行的命令,这里我们是运行nginx -g daemon off;

这里要注意的是,用ENTRYPOINT执行的命令 需要保持一个持续运行的进程存在,容器里边进程号是从0开始,如果是没有持续运行的进程,容器也会被关闭。

官方的话

If you add a custom CMD in the Dockerfile, be sure to include -g daemon off; in the CMD in order for nginx to stay in the foreground, so that Docker can track the process properly (otherwise your container will stop immediately after starting)!

Dockerfile 中还有更多的命令 可以从网上找到一堆,我这里不再过多叙述。
下一步就是制作镜像了,其实也很简单,在Dockerfile所在的目录下执行一条命令docker build

docker build -t mynginx:latest .

这条命令表示 创建一个名用mynginx的镜像并且打个标签latest ,别忘记最后的那一个.点
然后你可以看到镜像开始创建。
在这里插入图片描述
到这里,镜像已经创建好,可以供他人使用了。
在本机运行一下,

docker run --rm -p 80:80 nginx:latest

去浏览器访问宿主的ip的地址,你看可以看到,你的网站已经可以访问了。这就是从镜像运行容器。
同样的,后端我们一一的把nacos,redis,各微服务也做成镜像

--提前把nacos文件夹也放到Dockerfile同级目录,再执行docker build 
FROM java8
USER root
ENV MODE  standalone
EXPOSE 8848
WORKDIR /opt
COPY ./nacos  ./nacos
RUN touch /opt/nacos/logs/nacos.log   
ENTRYPOINT /bin/sh /opt/nacos/bin/startup.sh -m $MODE \
&& tail -f /dev/null

在这里插入图片描述
这些依赖工具都做成镜像后,我们的工作已经完成一半,接下来就该把我们的微服务也做到镜像了。

下一篇,我将来讲一下如何管理镜像以及通过MAVEN插件来构建镜像

posted on 2022-01-14 13:44  code monkey  阅读(99)  评论(0编辑  收藏  举报