镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件。它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
可以理解为虚拟机的快照,里面包含了所有部署的应用程序和它所关联的所有库。
通过镜像可以创建多个不同的容器。
镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统叫UnionFs
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。
docker将应用和环境打包成一个镜像,发布之后,启动运行
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样;
镜像:是定义
容器:是实体
镜像是模板,容器是实例
容器消亡时,容器存储层也随之消亡。任何保存于容器存储层的信息都会随容器删除而丢失。
Docker 最佳实践原则:容器不应该向其存储层内写入任何数据
所有的文件写入操作,都应该使用 数据卷(Volume)、或者 绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。
一个集中的存储、分发镜像的服务
Docker Registry公开服务允许用户免费上传、下载公开的镜像
docker镜像的拉取:
docker pull centos 拉取镜像
docker run --helper 查看run后可跟随的命令
从该镜像上创建一个容器:
docker run -it --name="mycentos" centos /bin/bash
exit 从主机中退回容器centos
(/bin/bash 是控制台
–name=“Name” 给容器起名字
-d 后台运行
-it 使用交互方式运行,进去容器查看内容
-p 指定端口 -p 8090:8090 主机端口:容器端口
-P 随机指定端口)
docker ps 列出当前正在运行的容器
docker ps -a 查看曾经运行的
docker ps -a -n=1 显示最近创建的1个容器
docker ps -q 只显示容器编号``
exit 退出容器,会关闭容器,需要restart重启容器,然后用attach命令才能再次进入容器
Ctrl + P + q 退出容器但不停止容器
docker rm 3093bde27248 移除容器(通过id)
docker rm -f $(docker ps -aq) 递归删除全部容器
docker start 3093bde27248 启动容器(通过id)
docker restart 3093bde27248 重启容器
docker stop 3093bde27248 停止当前正在运行的容器
docker kill 3093bde27248 强制停止/杀掉容器
docker run -d centos 必须要有一个前台进程才能启动成功
先启动docker镜像:
docker logs 142b32c2fd91 -f -t --tail 100
–tail N 仅列出最新N条容器日志
-f 跟踪日志输出
-t : 显示时间戳
查看容器进程信息:
docker top 142b32c2fd91
查看容器的所有信息(状态、配置、ip端口等):
docker inspect 142b32c2fd91
常用进入当前正在进行的容器,开启一个新的终端:
docker exec -it 142b32c2fd91 /bin/bash
以交互方式进入容器:
docker attch 142b32c2fd91
将文件拷贝到主机上:
docker start 64d9309de604
docker attach 64d9309de604
cd home
ls
touch test.java
ls
exit
docker cp 64d9309de604:/home/test.java /home
docker diff 88b9c9215b1a
#查看帮助
docker build -h
#根据dockerfile构建镜像
docker build /root/dockerfile-dir #绝对路径,也可以用相对路径.
#第二次构建就快很多,给镜像重命名tag
docker build /root/dockerfile-dir -t -test-image:v1.0
作用:根据dockerfile构建出一个镜像出来
dockerfile:用来构建镜像的文件,定义了一切的步骤,源代码
dockerImages:通过dockerfile构建生成的镜像,最终发布和运行的产品
DockerFile命令分类
BUILD | Both | RUN |
---|---|---|
FROM | WORKDIR | CMD |
MAINTAINER | USER | ENV |
COPY | EXPROSE | |
ADD | VOLUME | |
RUN | ENTERPOINT | |
ONBUILD | ||
.dockerignore |
DockerFile命令说明
命令 | 说明 |
---|---|
FROM | (这个镜像的妈妈是谁?)基础镜像,一切从这开始构建 |
MAINTAINER | (告诉别人谁负责养他?-最新官方已建议用LABELS)镜像是谁写的 |
RUN | (你想让他干啥)镜像构建时需要运行的命令 |
ADD | (给点创业资金)将文件拷贝到镜像中,会自动解压 |
WORKDIR | 镜像的工作目录 |
VOLUME | (给它一个放行李的地方)挂载的目录 |
EXPOSE | (它要打开的门是啥)暴露端口(经常用) |
CMD | 指定这个容器启动时要运行的命令,只有最后一个会生效,可被替代 |
ENTRYPOINT | 指定这个容器启动时要运行的命令,设置容器的入口程序可以追加命令(CMD是操作指令,ENTRYPOINT是配置指令) |
ONBUILD | 一个特殊指令,它后面跟的是其他指令,比如RUN,COPY,而这些指令在当前构建镜像时并不会被执行。只有以当前镜像为基础镜像,去构建下一级镜像时才会被执行 |
COPY | 类似ADD,将文件拷贝到镜像中,不会自动解压 |
ENV | 构建时设置环境变量,用户名、密码等 |
DockerFile实战
这里先熟悉一些基础Linux命令
Linux
mkdir 创建文件夹
touch 创建文件
rmdir 删除文件夹
rm 删除文件
pwd 显示当前路径
cd 进入目录
ls -l -a 列出目录及文件
mv 旧目录 新目录 重命名
cp a b 复制
DockerFile
准备条件
docker pull centos 拉取镜像
docker run -itd --name mycentos centos /bin/bash
docker ps
docker start mycentos
docker attach mycentos
ls
mkdir home
mkdir mydoc
cd mydoc
ls
touch mydockerfile
vi mydockerfile
复制并copy到mydockerfile,按esc,按:wq保存
FROM centos
MAINTAINER Lizongliang<[email protected]>
ENV MYPATH /user/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 90
CMD echo $MYPATH
CMD echo "--end--"
CMD /bin/bash
cat mydockerfile
docker build -f mydockerfile -t mysys:0.1 .
作用:将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。
docker commit -a="levi" -m="add webapps" 6bccd795dbd6 mytom.1.0 #提交镜像
docker images #查看提交了的镜像
docker rename 旧容器名 新容器名
注意:请在centos7进行,centos 8 会报错
yum -y install vim
将容器的目录挂载到自己电脑的E盘文件夹
docker run -it -v /home/ceshi:/home centos /bin/bash #(Linux)
docker run -it -v E:\docker_redis\doc:/home centos /bin/bash #(Windows环境,E:\docker_redis\doc请修改为具体文件夹路径,-v: 绑定一个卷)
docker inspect b24ab729f057 #查看是否挂载成功,成功会有"Mounts"路径
docker ps
docker attach b24ab729f057 进入容器
cd home
touch test.java #在home文件夹建立一个.java文件后,在E:\docker_redis\doc也会
看到这个.java文件
cat test.java #查看这个文件的内容【linux命令】
以上是bind方式挂载
volume方式待续
Mysql持久化问题待续22
待续
Compose 是用于定义和运行多容器 Docker 应用程序的工具。使用 YML 文件配合Compose命令,配置、创建、启动应用程序需要的所有服务。
示例:
在Linux文件夹中,建立一个postgres.yml文件
cd /home/composefiles
vim postgres.yml
postgres.yml填写内容
version: "3.6"
services:
postgres:
image: postgres:14.0
container_name: postgres
ports:
- 5432:5432
restart: always
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=123456
volumes:
- "/usr/local/postgresql/data:/var/lib/postgresql/data"
在home/composefiles目录下运行命令:
# yml配置了要拉取的镜像、启动的容器名称、端口、环境变量、挂载路径等,只要一条命令,就可以完成以上步骤,省去了docker run的复杂命令
docker-compose -f postgres.yml up -d
docker ps
docker swarm
CI/CD jenkins流水线
待续
nginx是一个高性能的web服务器:
docker pull nginx 拉取镜像
docker run -d --name mynginx -p 3344:80 nginx 启动镜像
localhost:3344 在本机Win电脑浏览器输入即可看见nginx已启动(注意防火墙需要开通3344端口)
docker exec -it mynginx /bin/bash
用完即删:
docker run -it --rm tomcat:9.0 下载tomcat用完即删
docker pull tomcat:9.0 或者直接下载镜像
docker run -d -p 3355:8080 --name mytom tomcat 启动
http://localhost:3355 浏览器启动,提示404无法访问,原因:默认最小镜像
cp -r webapps.dist/* webapps 运行这句,把必要的文件拷贝到webapps外面,再输入http://localhost:3355即可访问tomcat
portainer:docker的图形化管理工具,提供一个后台面板:
docker run -d -p 8077:9000 --restart=always -v /var/run/docker.sock --privileged=true portainer/portainer
http://localhost:8077/ 浏览器访问时报错
docker run -d --name portainer -p 8077:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer 改用这个再输入浏览器地址即可访问
#root权限进去jenkins容器
docker exec -it -u root jenkins bash