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安装docker官网: https://www.docker.com/
docker中文网站: https://www.docker-cn.com/
官方文档:https://docs.docker.com/
Docker Hub官网:https://hub.docker.com/
2.1 安装步骤*** 作系统: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
2.2 卸载Dockerrun干了什么:
1、停止Docker
systemctl stop docker
2、删除安装包
yum -y remove docker-ce
2、删除镜像、容器、配置文件等内容
rm -rf /var/lib/docker2.3 配置阿里云镜像加速
1、登陆阿里云
阿里云镜像获取地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
2、配置镜像加速
3、检查加速是否生效
三、Docker常用命令 3.1 帮助命令docker Version docker info docker --help3.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:禁止截断输出
-
指定列出收藏数不小于指定值的镜像
docker search -f stars=30 tomcat
-
限制搜索输出个数
docker search redis --limit 5
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]
-
OPTIONS说明(常用) :
- –name=“容器新名字”:为容器指定一个名称;
- -d:后台运行容器,并返回容器ID, 也即启动守护式容器;
- -i:以交互模式运行容器,通常与-t同时使用;
- -t:为容器重新分配一个伪输入终端,通常与-i同时使用;
- -P:随机端口映射;
- -p:指定端口映射,有以下四种格式
- ip:hostPort:containerPort
- ip::containerPort
- hostPort:containerPort
- containerPort
-
创建一个容器,使用镜像centos ,容器命名为mycentos1228
2、列出当前所有正在运行的容器
docker ps [OPTIONS]
-
OPTIONS说明(常用) :
- -a:列出当前所有正在运行的容器+历史上运行过的
- -|:显示最近创建的容器。
- -n:显示最近n个创建的容器。
- -q:静默模式,只显示容器编号。
- –no-trunc:不截断输出。
-
显示最近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 4.1 DockerFile简介
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"]
- 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 mrlinxiENV 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 自定义镜像Tomcat91、创建目录
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文件
test -
a.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
Insert title here -----------welcome------------ <%="i am in docker tomcat self "%>
<% System.out.println("=============docker tomcat self");%> -
查看日志信息
搜索镜像->拉取镜像->查看镜像->启动镜像->停止容器->移除容器
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 安装mysqldocker 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 /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基础 · 语雀
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)