Docker
概述
Docker 是一个开源的、轻量级的容器引擎,主要运行于 Linux 和 Windows,用于创建、管理和编排容器。
和 VMware 虚拟机相比,Docker 使用容器承载应用程序,而不使用操作系统,所以它的开销很少,性能很高。但是,Docker 对应用程序的隔离不如虚拟机彻底,所以它并不能完全取代 VMware。
组成
镜像
docker镜像 相当于一个模板, 通过这个模板来创建容器服务,可以创建多个容器
联合文件系统
下载B镜像时,如果已下载镜像A有部分内容重复,那么这部分内容将复用,复用的部分称为镜像的镜像层,而下载的部分为容器层
容器
docker利用容器技术,独立运行一组应用
启动 停止 删除 基本命令
理解为一个简易的linux系统
仓库
公有仓库和私有仓库 docker hub(默认是国外的)
阿里云 有容器服务器(镜像加速)
存放镜像!
安装
卸载旧的
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
在linux上安装docker
软件包
sudo yum install -y yum-utils
//设置镜像仓库 阿里云 默认是国外的
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新软件包索引
yum makecache fast
安装docker
sudo yum install docker-ce docker-ce-cli containerd.io
命令
启动
systemctl start dockers
systemctl start docker.service
查看版本
docker version
运行hello-world镜像
docker run centeros /bin/echo "Hello world"
# Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。
查看镜像
docker images
卸载
sudo yum remove docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
帮助命令
帮助文档 https://docs.docker.com/reference/
docker version # 显示docker版本信息
docker info # docker系统信息 包括镜像和容器数量
docker 命令 --help #帮助命令
镜像命令
docker images 查看所有本地主机上的镜像
#解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像id
CREATED 镜像的创建时间
SIZE 镜像大小
# 可选项
-a --all # 列出所有镜像
-q --quiet # 只显示id
docker serach 搜索镜像名(如mysql)
--filter=STARS=3000 搜素出来的镜像starts大于3000的
例子 docker search mysql --filter=stars=5000
docker pull 下载镜像
docker pull 镜像名:版本
docker pull mysql等价于
docker pull mysql docker.io/libray/mysql:latest
docker rmi 删除镜像
docker rmi -f 镜像id 删除容器
docker rmi -f 镜像id 镜像id 镜像id 删除多个容器
docker rmi -f $(docker images -aq) 删除全部容器
容器命令
有了镜像后 才能创建容器
下一个centeros
docker pull centos
新建容器并启动 ,操作对象是镜像, 进入后可修改镜像内的文件
docker run [可选参数] image
#参数
-t 在新容器内指定一个伪终端或终端。
-i 允许你对容器内的标准输入 (STDIN) 进行交互。
--name="Name" 容器名字
-d 以后台方式运行 nohup
-it 使用交互方式运行
-p 指定容器的端口 -p 8080:8080
-P 随机指定端口
--restart alway # always容器退出时重启 on-failure:容器故障退出(返回值非零)时重启 no:容器退出时不重启
-v 宿主机目录:容器目录 #
30 [OK]
# 启动并进入容器
docker run -it centos /bin/bash
exit 会退出并停止容器运行
列出所有运行的容器
docker ps
docker ps #当前正在运行的
-a #加上历史运行过的
-n=? #显示最近运行过的
-q #只显示容器id
退出容器 启动容器
exit # 停止并退出
Ctrl + P + Q #不停止退出
docker stop 容器id # 退出后 停止运行容器
docker start 容器id
docker restart 容器id
docker kill 容器id #强制..
删除容器
docker rm 容器id #删除指定容器
docker rm -f $(docker ps -aq) #删除所有容器
启动容器和停止容器
docker start 容器id
docker restart 容器id
docker stop 容器id
docker kill 容器id
进入正在运行的容器
#退出当前容器
exit
# 进入容器 并新起命令行
docker exec -it 容器id bash
#进入正在运行的命令行
docker attach 容器id bash
docker run 和docker exec的区别
- docker run 根据镜像创建一个容器,然后操作镜像
- docker exec 是进入一个正在运行的容器
根据容器创建一个新镜像
docker run -it -p xxx #启动容器
修改容器内的内容
新开一个窗口
docker commit -m="一次提交的信息" [要修改的容器id] 新的镜像名 #提交镜像
docker commit -a='yc9064' -m='docker新镜像提交测试' 96dd74b37e87 mynginx:v1
docker images #查看重新打好的镜像
docker run -d -p 8080:80 --name mynginx01 --restart always -v /root/nginx/html:/usr/share/nginx/html mynginx:v1
- -a :提交的镜像作者;
- -c :使用Dockerfile指令来创建镜像;
- -m :提交时的说明文字;
- -p :在commit时,将容器暂停。
常用其他命令
后台启动
docker run -d centos
#发现问题
docker ps 发现停止了
后台运行 必要有一个前台进程 docker发现没有应用会自动停止
常看日志
例
#执行循环脚本
docker run -d centos /bin/sh -c "while true;do echo hi;sleep 5;donre"
#查看容器id
docker ps
#查看输出的日志
docker logs -tf --tail 100 容器id
查看容器中进程信息
docker top 容器id
3.查看容器的元数据
docker inspect 容器id
从容器内拷贝文件到主机
docker cp 容器id:容器内文件路径 目的主机的路径
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xxSBlhvO-1640666584521)(.\img\1.png)]
阿里云镜像加速
登录阿里云找到容器镜像服务
找到镜像加速地址
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://5gw6wzma.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
使用镜像
安装nginx
docker pull nginx
#查看开放的端口号
firewall-cmd --list-ports
#开放8080端口
firewall-cmd --zone=public --add-port=8080/tcp --permanent
#重启
firewall-cmd --reload
#-p暴露端口(容器的) -d 后台运行 -name 给容器取名
#运行 nginx容器, 名字为nginx01 使用机器的8080端口映射到容器的80端口
# --restart always重启docker后启动容器
[root@masterServr ~]# docker run -d -p 8080:80 --name nginx01 --restart always -v /root/nginx/html:/usr/share/nginx/html nginx
WARNING: IPv4 forwarding is disabled. Networking will not work.
b435252b28d1b6a6bf944d470102371658744e10f948b6632249d3e59a0b9311
[root@masterServr ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b435252b28d1 nginx "/docker-entrypoint.…" 15 seconds ago Up 14 seconds 0.0.0.0:3344->80/tcp, :::3344->80/tcp nginx01
f67252424cc0 centos "/bin/bash" 18 hours ago Up 18 hours silly_zhukovsky
安装tomcat
# --rm 停止就删除 用来测试
docker run -it --rm tomcat:9.0
开放端口号
docker pull tomcat:9.0
docker runn -d -p ...
访问url,得到tomcat 404页面
进入容器中的webapp目录 发现为空
说明tomcat镜像被缩减
原因:默认是最小镜像,所有不必要的东西都剔除
容器数据卷
问题:如果数据存在容器中,那么我们删除容器,数据也一并被删除了.
需求: 数据可以持久化.
将容器内的目录挂载到主机上即可
总结: 为了容器的持久化和同步操作,容器间目录也可以共享
命令 -v 主机目录:容器目录
例:
docker run -d -p 8080:80 --name nginx01 --restart always -v /root/nginx/html:/usr/share/nginx/html nginx
具名和匿名挂载
docker run ... -v [容器内目录] ... # 匿名
docker run ... -v [取个名字]:[容器内目录]:[文件权限 ro/rw] ... # 具名 ro是容器文件只读权限,要改变文本需要走宿主机
docker volume ls # 查看所有挂载
docker inspect [volumeName]
容器间文件同步
容器间信息的传递, 比如mysq容器的l数据同步
docker run -it --name docker01 xxx:1.0
#把dcoker02 绑定到docker01 数据同步
docker run -it --name docker02 --volumes-from dcoker01 xxx:1.0
docker run -it --name docker01 mycentos:v1 bash
docker run -it --name docker02 --volumes-from docker01 mycentos:v1 bash
DockerFile
用来构建docker镜像的构建文件,一段命令脚本
所以 我们不仅可以通过修改容器并commit构建新的镜像到本地 ,也可以通过 docker build [dockerfile文件] 的方式来构建镜像
DockerFile构建过程
我们以后发布项目 ,做镜像 就要编写dockerfile
基础知识:
1.每个保留关键字(指令)必须大写
2.从上到下执行
3.#表示注释
4.每一个指令都会创建提交一个新的镜像层,并提交
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RPCpp8pD-1640666584523)(.\img\2.jpg)]
Dockerfile指令详解
-
FROM
基础镜像, FROM centos
-
MAINTAINER
标注作者和邮箱 FROM liuyinchuan yc906478@163.com
-
RUN
此操作会影响镜像
-
RUN [command]
shell中使用/bin/sh运行command 比如 RUN echo '这个容器的镜像是通过dockerfile构建的' > readMe.txt
-
RUN ['指定程序','参数1','参数2']
RUN["/bin/bash","-c","echo hello"]
-
-
CMD
CMD用于指定容器启动时执行的命令,每个Dockerfile只能有一个CMD命令,
构建镜像后,若容器启动时指定了运行的命令,则会覆盖掉CMD中指定的命令
CMD ['指定程序','参数1','参数2']
-
ENTRYPOINT
与CMD类似
构建镜像后,若容器启动时指定了运行的命令,则会在原来的指令中追加
-
EXPOSE
暴露端口配置 也可 run的时候加上 -p 【端口号】
-
ADD
加入文件到镜像内 如果是压缩包 会解压缩
ADD [源文件路径] [镜像内路径]
-
COPY
与ADD类似 不会解压文件
-
ENV
设置容器环境变量
ENV JAVA_HOME=/usr/local/jdk_1.8.201/
-
WORKDIR
为后续的RUN CMD ENTRYPOINT指定配置工作目录,可以使用多个WORKDIR指令,若后续指令用得是相对路径,则会基于之前的命令指定路径。
WORKDIR /path
FROM #基础镜像,一切从这里开始构建
MAINTAINER #镜像是谁写的,姓名+邮箱
RUN #镜像构建的时候需要运行的命令
ADD #步骤,tomcat镜像,这个tomcat的压缩包!添加内容
WORKDIR #镜像的工作目录
VOLUME #匿名挂载的目录
EXPOSE #暴露端口配置 也可 run的时候加上 -p 【端口号】
CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD #当构建一个被继承 Dockerfile 这个时候就会运行ONBUILD 的指令
COPY #类似ADD,将我们文件拷贝到镜像中
例:
新建一个dockerfile1
上传 jdk-8u281-linux-x64.tar.gz
vim dockerfile1
FROM centos # 使用centos作为基础镜像
MAINTAINER OBy yc906478@163.com
ENV MYPATH=/usr/local
WORKDIR $MYPATH
VOLUME ["volume01","volume02","volume03"] #匿名挂载目录
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo
CMD echo "---end---"
CMD /bin/bash
docker build -f dockerfile1 -t mycentos:v1 . #使用当前目录的dockerfile构建v1版的mycentos
docker run -it my
构建镜像
编写好dockerfile后, 可构建镜像到本地
docker build -t nginx:v3 .
docker build -f dockerfileName -t /filepath .
上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。
实战
Centos
创建名为Dockerfile的文件,这样不输入文件名build的时候会 找到这个文件
FROM centos:7
MAINTAINER OBy yc906478@163.com
ENV MYPATH=/usr/local
WORKDIR $MYPATH
VOLUME ["volume01","volume02","volume03"]
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo "---end---"
CMD /bin/bash
构建:
docker build -f mydockerfile-centeros -t mycentos:0.1
Tomcat
Dockfile
FROM centos
#作者
MAINTAINER yc 906478612@qq.com
#拷贝tomcat jdk 到镜像并解压
ADD apache-tomcat-8.5.73.tar.gz /usr/local/tomcat
ADD jdk-8u281-linux-x64.tar.gz /usr/local/jdk
RUN yum -y install vim
#定义交互时登录路径
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置jdk 和tomcat环境变量
ENV JAVA_HOME /usr/local/jdk/jdk1.8.0_281
ENV CATALINA_HOME /usr/local/tomcat/apache-tomcat-8.5.73
ENV CATALINA_BASE /usr/local/tomcat/apache-tomcat-8.5.73
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#设置暴露的端口
EXPOSE 8080
#运行tomcat
CMD /usr/local/tomcat/apache-tomcat-8.5.73/bin/startup.sh && tail -f /usr/local/tomcat/apache-tomcat-8.5.73/logs/catalina.out
docker run -d -p 8080:8080 --name mytomcat -v /usr/local/tomcat/logs:/usr/local/tomcat/apache-tomcat-8.5.73/logs/ -v /usr/local/tomcat/webapps:/usr/local/tomcat/apache-tomcat-8.5.73/webapps/ diytomcat