一、Docker简介
Docker的架构:
-
镜像(image):Docker镜像(lmage)就是一个只读的模板。镜像可以用来创建Docker容器,一个镜像可以创建很多容器 -
容器(container):Docker利用容器(Container) 独立运行的一个或一组应用。**容器是用镜像创建的运行实例。**它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。 -
仓库(repository):仓库是集中存放镜像文件的场所。仓库分为公开仓库(Public) 和私有仓库(Private) 两种形式。最大的公开仓库是Docker Hub(https://hub.docker.com/)存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云、网易云等
Docker的架构图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nJfXEywt-1640965352702)(https://gitee.com/jobim/blogimage/raw/master/img/20211224173904.svg)]
docker官网: https://www.docker.com/
docker中文网站: https://www.docker-cn.com/
官方文档:https://docs.docker.com/
Docker Hub官网:https://hub.docker.com/
二、Docker安装
操作系统:Centos7.0
官方教程:https://docs.docker.com/engine/install/centos/
2.1 安装步骤
1、卸载旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2、安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
yum install -y yum-utils device-mapper-persistent-data lvm2
3、设置镜像仓库(可以使用阿里云镜像安装)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4、更新yum软件包索引
yum makecache fast
5、安装Docker CE
Docker有两个分支版本:Docker CE和Docker EE,即社区版和企业版,因为企业版需要官方授权,所以我们一般用社区版
yum -y install docker-ce
6、启动Docker
systemctl start docker
7、通过运行 hello-world 映像来验证是否正确安装了 Docker Engine-Community
docker run hello-world
run干了什么:
2.2 卸载Docker
1、停止Docker
systemctl stop docker
2、删除安装包
yum -y remove docker-ce
2、删除镜像、容器、配置文件等内容
rm -rf /var/lib/docker
2.3 配置阿里云镜像加速
1、登陆阿里云
阿里云镜像获取地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
2、配置镜像加速器
3、检查加速器是否生效
三、Docker常用命令
3.1 帮助命令
docker Version
docker info
docker --help
3.2 镜像命令
1、查看所有本地主机上的镜像
docker images
-a 列出本地所有的镜像(含中间映射层)
-q 只显示镜像ID
--digests 显示镜像的摘要信息
--no-trunc 显示完整的镜像信息
2、搜索镜像
docker search [OPTIONS] 镜像名字
OPTIONS 说明:
--filter,-f:基于给定条件过滤输出
--format:使用模板格式化显示输出
--limit:Max number of search results ,默认值25
--no-trunc:禁止截断输出
NAME | 镜像仓库源的名称 |
---|
DESCRIPTION | 镜像描述 | STARS | 类似 Github 里面的 star,表示点赞、喜欢的数量 | OFFICIAL | 是否为docker 官方发布的镜像 | AUTOMATED | 自动构建 |
3、下载镜像
docker pull 镜像名字[:TAG],如果不写tag,默认是latest(最新版)
-
下载最新tomcat -
下载Mysql5.7 docker pull mysql:5.7
4、删除镜像
删除指定镜像:docker rmi -f 镜像id
删除多个镜像:docker rmi -f 镜像id 镜像id 镜像id
删除全部镜像:docker rmi -f $(docker images -aq)
5、提交镜像
docker commit 提交容器副本使之称为一个新的镜像
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
3.3 容器命令
1、新建并启动容器
docker run [OPTIONS] IMAGE [COMMAND][ARG]
2、列出当前所有正在运行的容器
docker ps [OPTIONS]
-
OPTIONS说明(常用) :
- -a:列出当前所有正在运行的容器+历史上运行过的
- -|:显示最近创建的容器。
- -n:显示最近n个创建的容器。
- -q:静默模式,只显示容器编号。
- –no-trunc:不截断输出。
-
显示最近2个创建的容器
3、退出容器
-
exit ,直接停止容器并退出 -
Crtl + Q + P ,不停止容器退出
4、删除容器
5、启动和停止容器
3.4 其他常用命令
1、在后台启动容器
docker run -d centos
注意:docker后台运行时,必须要有一个前台进程,如果docker容器发现没有运行的应用,会自动停止。
2、查看容器的日志
docker logs -tf --tail n(每次显示日志的行数) 容器id
-
-t 是加入时间戳 -
-f 跟随最新的日志打印 -
–tail 数字显示最后多少条
3、查看容器中的进程信息
docker top 容器id
4、查看镜像的元数据
docker inspect 容器id
5、进入当前正在运行的容器
-
在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入 -
docker attach 容器id ,直接进入容器启动命令的终端,不会启动新的进程 -
docker exec -it 容器ID bashShell ,是在容器中打开新的终端,并且可以启动新的进程
6、把容器内的文件拷贝到主机
docker cp 容器id:容器内要拷贝的文件路径 拷贝到主机的路径
四、Dockerfile
4.1 DockerFile简介
Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
构建三步骤:
文件长什么样?下面就是我们使用的centos的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="20201113" \
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-11-13 00:00:00+00:00"
# default cmd
CMD ["/bin/bash"]
Dockerfile内容基础知识:
Docker执行Dockerfile的大致流程:
-
(1)docker从基础镜像运行一个容器 -
(2)执行一条指令并对容器作出修改 -
(3)执行类似docker commit的操作提交一个新的镜像层 -
(4)docker再基于刚提交的镜像运行一个新容器 -
(5)执行dockerfile中的下一条指令直到所有指令都执行完成
4.2 DockerFile体系结构(保留字指令)
FROM :基础镜像,当前新镜像是基于哪个镜像的。基于什么镜像进行修改;
MAINTAINER :镜像维护者的姓名和邮箱地址;
RUN :容器构建时需要运行的命令;
EXPOSE :当前容器对外暴露出的端口;
WORKDIR :指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点,没写默认根目录/ ;
ENV :用来在构建镜像过程中设置环境变量;
ADD :将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包;
COPY :类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置; COPY src dest COPY ["src", "dest"]
- ADD跟COPY的区别在于ADD在复制后会自动解压缩和处理URL,而COPY仅仅进行复制。
VOLUME :容器数据卷,用于数据保存和持久化工作;
CMD :指一个容器启动时要运行的命令;Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换(后面案例会具体说明)
ENTRYPOINT :指定一个容器启动时要运行的命令;ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数;
- CMD与ENTRYPOINT的区别是CMD存在多个时只有最后一个生效以及CMD会被docker run之后的参数替换;而ENTRYPOINT是追加命令。
ONBUILD :当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
4.3 案例
4.3.1 Base镜像(scratch)
Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的。
4.3.2 自定义镜像mycentos
-
Hub默认CentOS镜像什么情况:
自定义mycentos目的使我们自己的镜像具备如下:
- 登陆后的默认路径
- vim编辑器
- 查看网络配置ifconfig支持
1、编写自定义镜像的Dockerfile
我们在宿主机的/mydocker 文件夹下,新建一个Dockerfile:vi Dockerfile ,写入下面的内容
FROM centos
MAINTAINER mrlinxi<mrzhme@vip.qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
2、构建自定义镜像——docker build
docker build -f /mydocker/Dockerfile -t mycentos:1.3 .
build语句最后面一个**. **表示当前目录。
3、运行自定义镜像——docker run
docker run -it mycentos:0.1
默认目录是/usr/locl,可以看到我们自己的新镜像已经支持vim/ifconfig命令,拓展成功
4.3.3 CMD/ENTRYPOINT 镜像案例
CMD/ENTRYPOINT都是指定一个容器启动时要运行的命令
CMD镜像案例:
Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换。
这里以tomcat为例,tomcat的dockerfile最后一句是CMD ["catalina.sh", "run"]
正常我们启动tomcat的命令是:docker run -it -p 主机端口:8080 tomcat
现在我们执行这样一句命令:docker run -it -p 8888:8080 tomcat ls -l
这样就相当于在tomcat的dockerfile后面又加了一句CMD ls -l ,因此会覆盖掉之前的语句。
此时tomcat并没有运行,只是查看了默认路径下的文件。
ENTRYPOINT镜像案例:
docker run 之后的参数会被当做参数传递给 ENTRYPOINT,之后形成新的命令组合
4.4 自定义镜像Tomcat9
1、创建目录
mkdir /mydocker/tomcat9
在该目录下新建touch.txt文件
2、将jdk和tomcat安装的压缩包拷贝进上述目录
3、在tomcat9目录下新建Dockerfile文件
FROM centos
MAINTAINER mrzhme<mrzhme@vip.qq.com>
#把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下
COPY c.txt /usr/local/cincontainer.txt
#把java与tomcat添加到容器中
ADD jdk-8u301-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.56.tar.gz /usr/local/
#安装vim编辑器
RUN yum -y install vim
#设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_301
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.56
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.56
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE 8080
#启动时运行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.56/bin/startup.sh" ]
# CMD ["/usr/local/apache-tomcat-9.0.56/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.56/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.56/bin/logs/catalina.out
4、构建镜像:docker build -t zbtomcat9 .
**注意:**这里为什么没有加 -f 和 Dockerfile 的路径?Dockerfile的标准文件名就是Dockerfile,当当前目录下用于构建镜像的Dockerfile的文件名是标准文件名时,可以省略-f+路径。这时Docker会直接读取当前目录下名为Dockerfile的文件进行镜像的构建。
5、创建容器并启动
docker run -d -p 9080:8080 --name myt9 -v /zzyyuse/mydockerfile/tomcat9/test:/usr/local/apache-tomcat-9.0.56/webapps/test -v /zzyyuse/mydockerfile/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.56/logs --privileged=true zbtomcat9
可以访问tomcat的界面
6、结合前述的容器卷将测试的web服务test发布
cd /mydocker/tomcat9/test
mkdir WEB-INF
-
在test目录下创建a.jsp文件,在WEB-INF下创建web.xml文件 <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>test</display-name>
</web-app>
-
a.jsp: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
-----------welcome------------
<%="i am in docker tomcat self "%>
<br>
<br>
<% System.out.println("=============docker tomcat self");%>
</body>
</html>
-
查看日志信息
五、Docker常用安装
5.1 总体步骤
搜索镜像->拉取镜像->查看镜像->启动镜像->停止容器->移除容器
docker search xxx -> docker pull xxx:TAG -> docker images xxx -> docker run [-itd -p port:port] [--name yyy] xxx:TAG -> docker stop 容器ID/yyy -> docker rm [-f] yyy
7.2 安装mysql
docker pull mysql:5.7
docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=10086 \
-d mysql:5.7
命令说明:
-
-p 12345:3306 :将主机的3306端口映射到docker容器的3306端口。 -
--name mysql :运行服务名字 -
-v /mydata/mysql/conf:/etc/mysql :将主机/mydata/mysql/conf目录,挂载到容器的/etc/mysql目录 -
-v /mydata/mysql/data:/var/lib/mysql :将主机的/mydata/mysql/data目录,挂载到容器的/var/lib/mysql目录 -
-v /mydata/mysql/log:/var/log/mysql :将主机的/mydata/mysql/log目录,挂载到容器的/var/log/mysql目录 -
-e MYSQL_ROOT_PASSWORD=10086 :初始化 root 用户的密码。 -
-d mysql:5.7 : 后台程序运行mysql5.7
7.3 安装redis
docker pull redis
docker run -p 6379:6379 -v /docker/myredis/data:/data -v /docker/myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis:3.2 redis-server /usr/local/etc/redis/redis.conf --appendonly yes
–appendonly yes 表示使用AOF进行持久化 (redis默认使用rdb进行持久化)
redis.conf是个文件夹,不是个文件 (小声BB:这个redis.conf文件夹是不是太容易引起歧义了?还有redis-server启动的时候,后面跟的那串不是指定的配置文件的路径吗,讲道理redis.conf应该就是个配置文件才对);
在主机/mydata/redis/conf/redis.conf目录下新建redis.conf文件
参考博客:Docker基础 · 语雀
|