Docker容器化技术实战操作汇总(附开发环境搭建)

网友投稿 333 2022-10-22

Docker容器化技术实战操作汇总(附开发环境搭建)

Docker 概述

​docker是什么:​Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的​​镜像​​​中,然后发布到任何流行的​​Linux​​​或​​Windows​​​ 机器上,也可以实现​​虚拟化​​​。容器是完全使用​​沙箱​​机制,相互之间不会有任何接口。

​官网​:​​服务器 A!服务器 B

​更简单的系统运维​

在容器化之后,我们的开发,测试环境都是高度一致的。

​更高效的计算资源利用​

Docker是内核级别的虚拟化,可以再一个物理机上运行很多个容器实例!服务器的性能可以被压榨到极致。

Docker的基本组成

​镜像(image):​

docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像—>run—>tomcat01容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。

​容器(container):​

Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的。启动,停止,删除,基本命令!目前就可以把这个容器理解为就是一个简易的linux系统

​仓库(repository):​

仓库就是存放镜像的地方!仓库分为公有仓库和私有仓库!Docker Hub(默认是国外的)阿里云…都有容器服务器(配置镜像加速!)

​♥ 注意:红色目录为一级目录 !​

Docker 文章目录

​​Docker 概述​​

​​容器化技术​​​​Docker的优点​​​​Docker的基本组成​​

​​下载安装 Docker​​

​​环境检查​​​​下载安装​​

​​卸载 Docker​​​​配置阿里云镜像加速​​​​底层原理​​

​​回顾我们安装好执行的 helloWord​​​​Docker 是怎么工作的?​​​​Docker 为什么比VM快?​​

​​Docker的常用命令​​

​​帮助命令​​

​​Dcoker 版本信息查看​​​​Dcoker 系统信息查看​​

​​镜像命令​​

​​镜像查看​​​​镜像搜索​​​​下载镜像​​​​删除镜像​​

​​容器命令​​

​​新建容器并启动​​​​从容器退回主机​​​​列出所有运行中的容器​​​​删除容器​​​​启动容器​​​​停止容器​​

​​其他命令​​

​​查看日志​​​​查看容器中进程信息​​​​查看镜像的元数据​​​​进入当前正在运行的容器​​​​从容器内拷贝文件到主机上​​

​​容器数据卷​​

​​什么是数据容器卷?​​​​使用容器数据卷​​​​具名挂载匿名挂载​​

​​初识Dockerfile​​

​​数据卷容器​​​​DockerFile​​​​DockerFile构建过程​​​​DockerFile指令​​​​DockerFile实战测试​​​​列出本地进行的变更历史​​

​​发布自已的镜像​​

​​发布到Dcoker Hub​​​​发布到阿里云​​

​​开发必备(重要)​​

​​一.安装MySQL​​​​二.安装Redis​​​​三.安装Nginx​​​​四.安装Tomcat​​

下载安装 Docker

注意,这里博主使用的是阿里云服务器,大家如果不想购买的话可以自已搭建,​​​​

​​本文中的所有命令都是 root 用户来操作的,若是其他用户记得加上 sudo​​

环境检查

环境查看命令

uname -r

我们这里选用的系统内核应该是 3.10 以上的

系统版本命令

cat /etc/os-release

下载安装

官网下载地址:​​remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-enginerm -rf /etc/systemd/system/docker.service.drm -rf /var/lib/dockerrm -rf /var/run/docker

下载docker安装包

yum install -y yum-utils

设置镜像仓库,docker默认是国外的仓库

#阿里云镜像地址yum-config-manager \ --add-repo \ makecache fast

安装docker (docker-ce社区版 dcoker-ee企业版)

yum install docker-ce docker-ce-cli containerd.io

查看已安装的docker信息

docker version

启动docker服务

systemctl start docker

hello world!

docker run hello-world

查看一下下载的这个 hello-world 镜像

docker images

卸载 Docker

#1.卸载依赖yum remove docker-ce docker-ce-cli containerd.io#2.删除资源 sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd #/var/lib/docker 的默认工作路径

卸载还是很容易的大家了解就可以了,在这就不进行演示了。

配置阿里云镜像加速

sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF'{ "registry-mirrors": ["systemctl daemon-reloadsudo systemctl restart docker

没有报错就说明配置完成喽~

底层原理

回顾我们安装好执行的 helloWord

Docker 是怎么工作的?

Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问!DockerServer接收到Docker-Client的指令就会执行这个命令!

Docker 为什么比VM快?

所以说,新建一个容器的时候,docker不需要向虚拟机一样重新加载一个操作系统内核,避免引导。虚拟机是加载Guest OS,分钟级别的,而docker是利用 宿主机的操作系统,省略了这个复杂的过程,秒级!

Docker的常用命令

帮助命令

万能的帮助命令

docker 命令 --help

Dcoker 版本信息查看

显示docker的版本信息,最好是启动 docker 服务后查看

docker version

Dcoker 系统信息查看

显示docker的系统信息,包括镜像和容器的数量

docker info

镜像命令

镜像查看

查看所有本地的主机上的镜像

docker images

这些列都是什么意思呢?不急下面我们逐一说明。

​REPOSITORY​镜像的仓库源​TAG​镜像的标签​IMAGE ID​镜像的id​CREATED​镜像的创建时间​SIZE​镜像的大小

这个命令还有两个常用可选项

镜像搜索

这个命令用于从Docker Hub查找镜像。

docker search 镜像名称

可选项,通过搜索来过滤

下载镜像

从Docker Hub下载镜像到本地。

docker pull 镜像名[:tag]

​​注意:tag是指定的版本,如果不写tag默认就是 latest(最新版)​​

​Digest​签名​docker.io/library/mysql:latest​真实地址

​指定版本下载​

删除镜像

删除指定镜像

docker rmi -f 镜像id

删除多个镜像

docker rmi -r 镜像id1 镜像id2 镜像id3

删除全部镜像(这里就涉及到 shell命令了感兴趣的可以查看文章:​​学妹面前装 “X” 必备,一篇文章教你学会Shell编程~​​)

docker rmi -r $(docker images -aq)

删除时最好通过id来删除保证唯一。这里演示一个就可以了,大家下去自行尝试吧 ~

容器命令

注意,我们要先有了镜像才可以创建容器。

新建容器并启动

docker run [可选参数] 镜像名

参数说明

​​--name="Name"​​ 容器名字 tomcat01 tomcat02 用来区分容器​​-d​​ 后台方式运行​​-it​​ 使用交互方式运行,进入容器内查看内容​​-p​​ 指定容器的端口 -p 8080:8080

从容器退回主机

直接容器停止并退出

exit

容器不停止退出

ctrl + p + q

列出所有运行中的容器

列出当前正在运行的容器

docker ps

可选参数

​​-a​​ 列出当前正在运行的容器+历史运行过的容器​​-n=1​​ 显示最近创建的一个容器​​-q​​ 只显示容器的编号

可以看到现在没有在运行的容器,下面我们加上​​-a​​参数查看一下历史运行过的容器。

删除容器

删除指定的容器,不能删除正在运行的容器

docker rm 容器id

强制删除指定的容器,加上​​-f​​ 参数即可

docker rm -f 容器id

删除所有的容器

docker rm -f $(docker ps -aq)

这里只演示了,根据id号删除指定(hello world)容器!

启动容器

后台启动容器,没有则创建

docker run -d 容器名|容器id

​​注意:docekr ps 发现容器停止了​​

​​说明:docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止。​​

启动运行过的容器,需要先查看容器的id在根据id启动一个容器。

docker start 容器id

重启容器,和启动容器方法基本一致。

docker restart 容器id

停止容器

停止当前正在运行中的容器

docker stop 容器id

强制停止当前容器

docker kill 容器id

其他命令

查看日志

docker logs -tf --tail 10 容器id

可选参数

​​-tf​​ 显示日志​​--tail number​​ 显示日志条数

查看容器中进程信息

docker top 容器id

查看镜像的元数据

docker inspect 容器id

进入当前正在运行的容器

我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置

第一种

docker exec -it 容器id /bin/bash

第二种

docker attach 容器id

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

docker cp 容器id:容器内路径 目标的主机路径

容器数据卷

什么是数据容器卷?

docker的理念回顾。将应用和环境打包成一个镜像!数据都在容器中,如果我们删除容器,数据就会丢失!需求:数据可以持久化,mysql数据可以存储在本地。容器之间可以有一个数据共享技术,docker容器中产生的数据,同步到本地!这就是卷技术!目录的挂载,将我们容器内的目录,挂载到linux上面。

总结一句话:​​容器的持久化和同步操作,容器间也是可以数据共享的!​​

使用容器数据卷

使用命令来进行挂载

docker run -dit -v 主机目录:容器内目录

启动成功后可以使用docker inspect 容器id 命令查看详细信息

测试文件的同步,我们现在宿主机上创建test.java文件

然后我们进入容器内查看文件是否存在

再次测试,停止容器,在宿主机上修改文件,启动容器,容器内的数据依旧是同步的

​​好处:我们以后修改只需要在本地修改即可,容器内会自动同步!​​

具名挂载匿名挂载

​匿名挂载​

docker run -d -P --name nginx01 -v /ect/nginx nginx

查看所有的volume的情况

docker volume ls

这个就是匿名挂载,我们在 -v 后只写了容器内的路径,没有写容器外的路径!

​具名挂载​

docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx

查看所有的volume的情况

具名挂载,通过 -v 卷名:容器内路径

查看卷

我们通过具名挂载可以方便的找到我们的一个卷,大多数情况下使用 ​具名挂载​

如何确定是具名挂载还是匿名挂载,还是指定路径挂载?

​​-v 容器内路径​​ 匿名挂载​​-v 卷名:容器内路径​​ 具名挂载​​-v /宿主机路径:容器内路径​​ 指定路径挂载

​拓展​

通过 -v 容器内路径:ro rw 改变读写权限

​​ro(readonly)​​ 只读,只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作的。​​rw(readwrite)​​ 可读可写。

一旦设置了容器权限,容器对我们挂载出来的内容就有了限定

docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx

docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx

初识Dockerfile

Dockerfile 就是用来构建 docker 镜像的构建文件!命令脚本!先体验一下!通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层。

数据卷容器

多个mysql同步数据

DockerFile

DcokerFile介绍

​​dockerfile是用来构建docker镜像的文件!命令参数脚本!​​

构建步骤:编写一个dockerfile文件docker build 构建成为一个镜像docker run 运行镜像docker push 发布镜像(DockerHub,阿里云镜像仓库)

我们来看一下官方是怎么做的

DockerFile构建过程

基础知识

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

dockerfile 是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!Docker镜像逐渐成为企业交付的标准,必须要掌握!步骤:开发,部署,运维。。。缺一不可​DockerFile​:构建文件,定义了一切的步骤,源代码​DockerImages​:通过DockerFile构建生成的镜像,最终发布和运行的产品​Docker容器​:容器就是镜像运行起来提供服务的

DockerFile指令

以前的话我们都是使用别人的,现在我们知道了这些指令后,我们来练习自已写一个镜像!

指令

说明

FROM

基础镜像,一切从这里开始构建

MAINTAINER

镜像是谁写的,姓名+邮箱

RUN

镜像构建的时候需要运行的命令

ADD

添加内容

WORKDIR

镜像的工作目录

VOLUME

挂载的目录

EXPOSE

保留端口配置

CMD

指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代

ENTRYPOINT

指定这个容器启动的时候要运行的命令,可以追加命令

ONBUILD

当构建一个被继承DockerFile 这个时候就会运行ONBUILD的指令。触发指令。

COPY

类似ADD,将我们文件拷贝到镜像中

ENV

构建的时候设置环境变量!

​CMD 和 ENTRYPOINT 区别​

​​CMD​​ 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代

# 编写dockerfile 文件[root@iZ8vbjbtw24uc8kaw16kvsZ dockerfile]# vim centostestFROM centosCMD ["ls","-a"]# 构建镜像[root@iZ8vbjbtw24uc8kaw16kvsZ dockerfile]# docker build -f centostest -t cmdtest .# run运行,发现我们的ls -a命令生效[root@iZ8vbjbtw24uc8kaw16kvsZ dockerfile]# docker run ccf40f4cce18....dockerenvbindevetchomeliblib64lost+foundmediamntoptprocrootrunsbinsrvsystmpusrvar# 想追加一个命令 -l ls -al[root@iZ8vbjbtw24uc8kaw16kvsZ dockerfile]# docker run ccf40f4cce18 -ldocker: Error response from daemon: OCI runtime create failed: container_linux.go:367: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.ERRO[0000] error waiting for container: context canceled # cmd的情况下 -l 替换了CMD["ls","-a"]命令,-l 不是命令所以报错!

​​ENTRYPOINT​​ 指定这个容器启动的时候要运行的命令,可以追加命令

# 编写dockerfile 文件[root@iZ8vbjbtw24uc8kaw16kvsZ dockerfile]# vim dockerfile-cmd-entoryFROM centosENTRYPOINT ["ls","-a"]# 构建镜像[root@iZ8vbjbtw24uc8kaw16kvsZ dockerfile]# docker build -f dockerfile-cmd-entory -t dockeren .# 我们的追加命令,是直接拼接在我们的 ENTRYPOINT 命令的后面![root@iZ8vbjbtw24uc8kaw16kvsZ dockerfile]# docker run ffdaffe72ed2 -ltotal 56drwxr-xr-x 1 root root 4096 Mar 31 01:06 .drwxr-xr-x 1 root root 4096 Mar 31 01:06 ..-rwxr-xr-x 1 root root 0 Mar 31 01:06 .dockerenvlrwxrwxrwx 1 root root 7 Nov 3 15:22 bin -> usr/bindrwxr-xr-x 5 root root 340 Mar 31 01:06 devdrwxr-xr-x 1 root root 4096 Mar 31 01:06 etcdrwxr-xr-x 2 root root 4096 Nov 3 15:22 homelrwxrwxrwx 1 root root 7 Nov 3 15:22 lib -> usr/liblrwxrwxrwx 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64drwx------ 2 root root 4096 Dec 4 17:37 lost+founddrwxr-xr-x 2 root root 4096 Nov 3 15:22 mediadrwxr-xr-x 2 root root 4096 Nov 3 15:22 mntdrwxr-xr-x 2 root root 4096 Nov 3 15:22 optdr-xr-xr-x 96 root root 0 Mar 31 01:06 procdr-xr-x--- 2 root root 4096 Dec 4 17:37 rootdrwxr-xr-x 11 root root 4096 Dec 4 17:37 runlrwxrwxrwx 1 root root 8 Nov 3 15:22 sbin -> usr/sbindrwxr-xr-x 2 root root 4096 Nov 3 15:22 srvdr-xr-xr-x 13 root root 0 Mar 29 05:51 sysdrwxrwxrwt 7 root root 4096 Dec 4 17:37 tmpdrwxr-xr-x 12 root root 4096 Dec 4 17:37 usrdrwxr-xr-x 20 root root 4096 Dec 4 17:37 var

Dockerfile中很多命令都十分的相似,我们需要了解它们的区别,我们最好的学习就是对比他们然后进行测试效果!

DockerFile实战测试

Docker Hub 中99%镜像都是从这个基础镜像过来的 FROM scratch,然后配置需要的软件和配置来进行构建

​创建一个自已的centos​

编写Dockerfile的文件

FROM centos # 基础镜像MAINTAINER yl<1903838739@qq.com> # 作者和邮箱ENV MYPATH /usr/local # 设置环境变量WORKDIR $MYPATH # 设置工作目录#下载相关依赖,默认下载的centos镜像是不支持vim和ifconfig指令的,下载了这两个依赖就可以运行vim和ifconfig指令RUN yum -y install vimRUN yum -y install net-toolsEXPOSE 80 # 暴露端口CMD echo $MYPATHCMD echo "---end---"CMD /bin/bash # 容器启动时进入/bin/bash目录

通过这个文件构建镜像

docker build -f dockerfile文件路径 -t 镜像名:[tag]

​​docker build -f mycentos -t mzccentos:0.1 .​​

mycentos 是文件名,如果不在文件所在文件夹路径下就要写全路径,mzccentos是自己的镜像名,0.1是版本号,注意后面还有个​​.​​不能省略。

测试运行

docker run -it mzccentos:0.1

到这我们自已手写的dockerfile就运行起来了。

列出本地进行的变更历史

docker history 容器id

发布自已的镜像

发布到Dcoker Hub

前往Docker Hub官网注册账号确保可以登录

官网:​​login -u用户名 回车后输入密码

修改镜像名称(​​命名规则 DockerHub用户名/镜像名:版本号​​)

注意:如果不修改后续push时可能会出现异常

在我们服务器上提交自已的镜像

docker push 镜像名

前往Docker Hub 查看

发布到阿里云

登录阿里云并搜索容器镜像服务

创建命名空间

创建容器镜像

浏览阿里云

5. 推送

#登录阿里云docker login --username=周周class registry.cn-zhangjiakou.aliyuncs.com#修改镜像名docker tag [ImageId] registry.cn-zhangjiakou.aliyuncs.com/mzcck/mzc-java:[镜像版本号]#推送镜像到阿里云docker push registry.cn-zhangjiakou.aliyuncs.co![请添加图片描述](rmi -f $(docker images -q)

docker rm -f $(docker ps -aq)

一.安装MySQL

这里我们演示Docker安装MySQL 5.7并挂载数据及配置文件

获取镜像

docker pull mysql:5.7

数据挂载,配置密码,并运行容器

docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7

参数解释:​​-d 后台运行 -p 端口映射 -v 挂载卷 -e 环境配置 --name 容器名称​​

通过本地Navicat工具连接MySQL

新建数据库测试挂载是否有问题

新建后发现,我们挂载到本地的data目录下已经有了最新创建的数据库信息,即使删除镜像我们挂载到本地的数据库卷依旧不会丢失,这就实现了容器数据持久化功能!

二.安装Redis

Docker安装redis,挂载外部配置和数据

从dockerHub拉取镜像到本地

docker pull redis

创建目录(宿主机)

配置文件目录(在该目录下放置 redis.conf配置文件,目录可以自定义)

mkdir -p /home/redis/conf

数据目录

mkdir -p /home/redis/data

启动容器,加载配置文件并持久化数据

docker run -d --privileged=true -p 6379:6379 --restart always -v /home/redis/conf/redis.conf:/etc/redis/redis.conf -v /home/redis/data:/data --name myredis redis redis-server /etc/redis/redis.conf --appendonly yes

参数解释:

​​-d​​ 以守护进程的方式启动容器​​--privileged=true​​ 提升容器内权限​​-p 6379:6379​​ 绑定宿主机端口​​--restart always​​ 开机启动​​-v /home/redis/conf/redis.conf​​ 映射配置文件​​-v /home/redis/data​​ 映射数据目录​​--name myredis​​ 指定容器名称​​--appendonly yes​​ 开启数据持久化

使用redis客户端连接测试(redis没有设置用户名和密码,直接通过ip与端口即可连接)

添加数据测试挂载是否生效

到此,我们的redis安装挂载也没问题了

三.安装Nginx

Docker安装 nginx并挂载宿主机目录到容器中

下载 nginx 镜像(这里直接拉最新版,大家可以根据需要下载对应的版本)

docker pull nginx

在宿主机创建挂载目录

日志目录

mkdir /home/nginx/log

配置文件目录

mkdir /home/nginx/conf

项目位置

mkdir /home/nginx/html

启动镜像并完成对应的挂载与配置

docker run --name mynginx -d -p 80:80 -v /home/nginx/log:/var/log/nginx -v /home/nginx/conf.d:/etc/nginx/conf.d -v /home/nginx/html:/usr/share/nginx/html nginx

​注意:这里虽然启动成功了但是少挂载了 ​​nginx.conf​​ 配置文件,因为直接挂载会报错所以我们按照下方操作来​

上面容器启动成功后我们先进入容器​​docker exec -it 容器id /bin/bash​​进入容器后找到 nginx.conf文件的位置。​​cd /etc/nginx​​,注意查看文件是否存在。退出容器 ​​exit​​

docker run --name mynginx -d -p 80:80 -v /home/nginx/log:/var/log/nginx -v /home/nginx/conf.d:/etc/nginx/conf.d -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/html:/usr/share/nginx/html nginx

参数解释:

​​-d​​ 以守护进程的方式启动容器​​--name myredis​​ 指定容器名称​​-p 80:80​​ 绑定宿主机端口

到此我们 nginx挂载并运行已经完成了

四.安装Tomcat

下载tomcat镜像,这里依旧采用最新版

docker pull tomcat

启动镜像

docker run --name tomcat -itd --privileged=true --rm -v /home/tomcat/webapp:/usr/local/tomcat/webapps/webapp -p 8080:8080 tomcat

参数说明:

​​--name tomcat​​ 创建容器名称为tomcat​​--privileged=true​​允许镜像挂载映射本地目录​​-p 8081:8080​​ 端口映射​​-v​​ 数据卷挂载​​-itd​​ 以后台守护进程启动容器​​tomcat​​ tomcat镜像名

我们访问测试发现报404

让我们进入容器中一探究竟

docker exec -it 容器id /bin/bash

进来后我们发现webapp下没有东西。阿里云镜像的原因。默认是最小的镜像,所有不必要的都剔除掉,保证最小可运行的环境。

解决方案:

cp -r webapps.dist/* webapps

再次测试:

大功告成。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Mybatis如何使用动态语句实现批量删除(delete结合foreach)
下一篇:[云原生专题-6]:容器 - Docker概述以及虚拟机的比较
相关文章

 发表评论

暂时没有评论,来抢沙发吧~