Docker学习笔记
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!