服务端基础docker

docker

2020-06-21  本文已影响0人  贪挽懒月

一、docker简介

1、为什么会出现docker?
一般情况下是开发人员开发好代码,本地测试通过后,打成jar包或者war包,交给运维人员,部署到服务器上。就是这么个过程,经常会出现如下场景:

一样的代码,本地可以跑,服务器上就不行,那这就是环境的问题和配置的问题了。而且,一个产品从开发到上线,往往有开发环境,测试环境,仿真环境和生产环境,每个环境我们都需要安装一遍mysql、redis、nginx,activemq等,运维的工作量也挺大,而且都是重复的工作。为了解决这些痛点,docker就出现了。


欢迎大家关注我的公众号 javawebkf,目前正在慢慢地将简书文章搬到公众号,以后简书和公众号文章将同步更新,且简书上的付费文章在公众号上将免费。


2、是什么?

docker就是一个容器,一次构建,处处运行。也就是说,我开发环境安装了mysql、redis,我可以直接将这两个镜像搬到测试环境,开箱即用,而不用重新去配置。

3、虚拟机技术和容器技术:

4、docker的核心概念:

二、docker的安装

1、安装前提:

2、docker的安装:

centos 6安装docker:

centos 7安装docker:

yum remove docker \
           docker-client \
           docker-client-latest \
           docker-common \
           docker-latest \
           docker-latest-logrotate \
           docker-logrotate \
           docker-engine
yum-config-manager \
   --add-repo \
   http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
mkdir -p /etc/docker
vim /etc/docker/daemon.json
systemctl daemon-reload
systemctl restart docker

daemon.json的内容如下:

# 网易云
{"registry-mirrors":["http://hub-mirror.c.163.com"]}
# 阿里云
{"registry-mirrors":["你阿里云的镜像加速链接"]}

获取阿里云加速镜像链接的方法:
登陆https://cr.console.aliyun.com,然后点击左下角的“镜像加速器”即可。

systemctl stop docker
yum -y remove docker-ce
rm -rf /var/lib/docker

3、hello world:
上面说过执行docker run hello-world会打印出相关信息,执行这条命令过程如下:

三、docker常用命令

1、帮助命令:

2、镜像命令:
回顾一下docker的logo,海上有一头鲸鱼,鲸鱼背上有一个个的集装箱。对应关系如下:

常用镜像命令如下:

3、容器命令:
首先我们执行docker pull centos拉取一个centos的镜像,下面所说的容器都是指centos(都可以是名字或者id)。

四、docker镜像

1、什么是镜像?
镜像是一种轻量级的可执行的独立软件包。用来打包软件运行环境和基于运行环境开发的软件,包括代码、运行时、库、环境变量和配置文件。docker底层是一个unionFS(联合文件系统),即是一层一层的文件系统组成。

2、镜像为什么那么大?
执行docker pull tomcat命令,下载一个tomcat镜像,然后执行docker images,发现一个tomcat就600多兆,为什么那么大?因为刚才说的,镜像是一个联合文件系统,tomcat镜像不仅仅包含tomcat,还包含tomcat运行的各种环境,一个镜像包含了很多层,分层镜像如下:

tomcat镜像

3、docker为什么采用分层镜像?
最大的好处就是共享资源。比如多个镜像都需要jdk,那么宿主机上其实只要保存一份jdk就可以了,内存中也只需要加载一份。镜像的每一层都是可以共享的。

4、docker commit命令:
首先我们运行docker run -it -p 8888:8080 tomcat,这里表示docker内部将tomcat运行在8080端口,对外暴露8888端口,即执行完这条命令,我们要用8888端口才能访问到tomcat。如果你访问到的是404,不要方,这是因为你下载的这个版本的tomcat,webapps目录是空的,资源都在webapps-dist目录下,可以执行如下操作:

刷新页面,就可以看到熟悉的tomcat首页了。
上面是指定对外暴露8888端口,还可以执行docker run -it -P tomcat,大写的P表示随机分配端口,不自己指定。用这个命令启动后,执行docker ps,就可以看到随机分配的端口是什么。

上面我们对tomcat做了一些修改,把访问会报404的tomcat改成了一个正常的tomcat,我们就可以使用commit命令以我们改好的tomcat为模板,生成一个启动就能直接访问的新的tomcat镜像。执行如下命令:
docker commit -a="zhusl" -m="normal tomcat" 容器id newtomcat:1.0

五、容器数据卷

1、是什么?
我们在docker上运行容器实例,运行时产生的数据,当docker关闭了就没了。但是我们希望有些数据可以持久化保存下来,这个保存的地方的就是容器数据卷,并且保存下来的数据可以共享。

2、容器数据卷的特点:

3、添加数据卷的方法:
添加数据卷有两种方法,一种是命令添加,一种是用dockerfile。
命令添加:

dockerFile添加:

FROM centos
VOLUME ["/dockerdatadir1","/dockerdatadir2"]
CMD echo "finished,---------success"
CMD /bin/bash

4、数据卷容器:
上面说了数据卷,数据卷容器其实就是数据卷之间的传递性。比如还是以zhusl/centos镜像为例,先执行docker run -it --name dc01 zhusl/centos,运行一个名为dc01的实例,然后再执行docker run -it --name doc02 --volumes-from dc02 zhusl/centos,以dc01为父容器,运行一个dc02。因为zhusl/centos是添加了数据卷的,所以运行的dc01是挂载了数据卷的,然后dc02又是from dc01,所以dc02也挂载了数据卷。如果还有一个dc03也是继承自dc01,当dc01挂了,dc02和dc03之间也是可以进行数据共享的。

六、dockerFile

1、是什么?
就是一个写命令的文件,然后通过这个文件,就可以构建镜像。

2、构建的三个步骤:

登陆docker hub,然后随便搜索一个镜像,就以centos为例,选择版本然后进入,就可以看到它的dockerfile文件内容。如下就是centos7的dockerfile文件内容:

FROM scratch
ADD centos-7-x86_64-docker.tar.xz /

LABEL \
    org.label-schema.schema-version="1.0" \
    org.label-schema.name="CentOS Base Image" \
    org.label-schema.vendor="CentOS" \
    org.label-schema.license="GPLv2" \
    org.label-schema.build-date="20200504" \
    org.opencontainers.image.title="CentOS Base Image" \
    org.opencontainers.image.vendor="CentOS" \
    org.opencontainers.image.licenses="GPL-2.0-only" \
    org.opencontainers.image.created="2020-05-04 00:00:00+01:00"

CMD ["/bin/bash"]

3、dockerfile内容基础知识:

4、dockerfile的执行流程:

5、dockerfile的保留字:

6、dockerfile构建镜像实操:

# 基于docker hub上拉下来的centos进行构建
FROM centos
# 容器启动后工作目录
WORKDIR ~
# 安装vim
RUN yum -y install vim
# 安装网络工具,使其能用ifconfig命令
RUN yum -y install net-tools
# 端口号
EXPOSE 80
CMD /bin/bash

新建一个dockerfile2文件,内容就是上面那段,然后执行docker build -f /mydocker/dockerfile2 -t mycentos:1.0 .进行构建。-f后面的是dockerfile2文件的路径,mycentos是镜像名字,1.0是版本号,.代表当前路径。

执行完后,docker images就会发现有一个新镜像,名字叫mycentos。然后运行该镜像,就会发现这个mycentos可以使用vim和ifconfig的。再回溯一个问题,镜像那么大,是因为它包含了它运行所需的所有环境,那么是不是很浪费空间?就比如这个,我原本有一个centos镜像,只不过没有vim编辑器,现在我构建一个新的有vim的mycentos,docker images 显示centos 600M,mycentos 620M,那这两个是不是就要占用1个G?其实并不是,因为镜像是可以共享的,mycentos 是form centos的,也就是说这600其实是共用的,最后这两个镜像其实占空间就是620M。

执行docker history 镜像id,就可以列出镜像的历史,即这个镜像有多少层。

FROM centos
RUN yum install -y curl
CMD ["curl","-s","http://ip.cn"]

意思就是制作一个镜像,一启动,就可以查出本机的IP。执行docker build -f /mydocker/dockerfile3 -t myip .进行构建。然后运行该容器,就可以打印出ip信息。如果过执行的时候想加参数,比如docker run -it myip -i,实际上就是想执行curl的时候加上-i参数,打印请求头信息,那么抱歉,-i会覆盖之前的命令,即覆盖CMD ["curl","-s","http://ip.cn"]这一样,然后-i根本就不是一个可执行命令,所以执行报错。要实现上面的需求,即加个-i,让它真正执行的是curl -s -i https://ip.cn,只需要把CMD换成ENTRYPOINT,然后启动容器时用docker run -it myip -i即可。

ONBUILD RUN echo "我被触发了"

然后,新建dockerfile4,FROM myip,build的时候会打印出 "我被触发了" 这一句话。

FROM   centos
# 复制文件
COPY copy.txt /usr/local/cincontainer.txt
# 添加并解压jdk
ADD jdk-8u171-linux-x64.tar.gz /usr/local
# 添加并解压tomcat9
ADD apache-tomcat-9.0.8.tar.gz /usr/local
# 安装vim
RUN yum install -y install vim
# 设置登陆落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
# 配置jdk和tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:CATALINA_HOME/bin
# 指定容器运行端口
EXPOSE 8080
# 启动命令
CMD /usr/lcoal/apache-tomcat-9.0.8/bin/startup.sh && tail -F /usr/local/apache-tomat-9.0.8/bin/logs/catalina.out

七、常用镜像安装

1、MySQL:

2、redis:

八、本地镜像推送到阿里云

创建镜像仓库
docker login --username= registry.cn-hangzhou.aliyuncs.com
# 执行完上一条命令会要你输入用户名和密码
docker tag 镜像id registry.cn-hangzhou.aliyuncs.com/zhushulin/redis:镜像版本号
docker push registry.cn-hangzhou.aliyuncs.com/zhushulin/redis:镜像版本号
上一篇下一篇

猜你喜欢

热点阅读