Docker的架构:
镜像(image):Docker镜像(lmage)就是一个只读的模板。镜像可以用来创建Docker容器,一个镜像可以创建很多容器
容器(container):Docker利用容器(Container) 独立运行的一个或一组应用。**容器是用镜像创建的运行实例。**它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
仓库(repository):仓库是集中存放镜像文件的场所。仓库分为公开仓库(Public) 和私有仓库(Private) 两种形式。最大的公开仓库是Docker Hub(https://hub.docker.com/)存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云、网易云等
Docker的架构图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wTRQLv92-1641366706238)(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/
操作系统:Centos7.0
官方教程:https://docs.docker.com/engine/install/centos/
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干了什么:
1、停止Docker
systemctl stop docker
2、删除安装包
yum -y remove docker-ce
2、删除镜像、容器、配置文件等内容
rm -rf /var/lib/docker
1、登陆阿里云
阿里云镜像获取地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
2、配置镜像加速器
3、检查加速器是否生效
docker Version
docker info
docker --help
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(最新版)
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 要创建的目标镜像名:[标签名]
1、新建并启动容器
docker run [OPTIONS] IMAGE [COMMAND][ARG]
OPTIONS说明(常用) :
创建一个容器,使用镜像centos ,容器命名为mycentos1228
2、列出当前所有正在运行的容器
docker ps [OPTIONS]
OPTIONS说明(常用) :
显示最近2个创建的容器
3、退出容器
exit
,直接停止容器并退出
Crtl + Q + P
,不停止容器退出
4、删除容器
docker rm 容器id
,删除指定的容器,不能删除正在运行的容器,如果要强制删除 rm -f
docker rm -f $(docker ps -aq)
,删除全部容器
5、启动和停止容器
docker start 容器id
,启动容器
docker restart 容器id
,重启容器
docker stop 容器id
,停止当前正在运行的容器
docker kill 容器id
,强制停止容器
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是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
构建三步骤:
编写Dockerfile文件:必须符合file规范
docker build:docker build -f /mydocker/Dockerfile -t mrlinxi/centos .
通过docker build获得一个自定义的镜像
docker run
文件长什么样?下面就是我们使用的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中的下一条指令直到所有指令都执行完成
FROM
:基础镜像,当前新镜像是基于哪个镜像的。基于什么镜像进行修改;
MAINTAINER
:镜像维护者的姓名和邮箱地址;
RUN
:容器构建时需要运行的命令;
EXPOSE
:当前容器对外暴露出的端口;
WORKDIR
:指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点,没写默认根目录/
;
ENV
:用来在构建镜像过程中设置环境变量;
例如:ENV MY_PATH /usr/mytest
这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样;也可以在其它指令中直接使用这些环境变量。
比如:WORKDIR $MY_PATH
ADD
:将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包;
COPY
:类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置; COPY src dest
COPY ["src", "dest"]
VOLUME
:容器数据卷,用于数据保存和持久化工作;
CMD
:指一个容器启动时要运行的命令;Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换(后面案例会具体说明)
ENTRYPOINT
:指定一个容器启动时要运行的命令;ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数;
ONBUILD
:当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的。
自定义mycentos目的使我们自己的镜像具备如下:
1、编写自定义镜像的Dockerfile
我们在宿主机的/mydocker
文件夹下,新建一个Dockerfile:vi Dockerfile
,写入下面的内容
FROM centos
MAINTAINER mrlinxi
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命令,拓展成功
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,之后形成新的命令组合
1、创建目录
mkdir /mydocker/tomcat9
在该目录下新建touch.txt文件
2、将jdk和tomcat安装的压缩包拷贝进上述目录
3、在tomcat9目录下新建Dockerfile文件
FROM centos
MAINTAINER mrzhme
#把宿主机当前上下文的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文件
<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>testdisplay-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 heretitle>
head>
<body>
-----------welcome------------
<%="i am in docker tomcat self "%>
<br>
<br>
<% System.out.println("=============docker tomcat self");%>
body>
html>
查看日志信息
搜索镜像->拉取镜像->查看镜像->启动镜像->停止容器->移除容器
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
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
拉去镜像
docker pull redis
运行容器
docker run -p 6379:6379 -v /mydocker/myredis/data:/data -v /mydocker/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应该就是个配置文件才对);
在主机/mydocker/myredis/conf/redis.conf目录下新建redis.conf文件
vi /mydocker/myredis/conf/redis.conf/redis.conf
测试redis-cli连接上来
docker exec -it 0db7f7ff5557 redis-cli
参考博客:Docker基础 · 语雀