Docker基础
更轻松的维护和扩展
Docker 使⽤的分层存储以及镜像的技术,使得应⽤重复部分的复⽤更为容易,也使得应⽤的维护 更新更加简单,基于基础镜像进⼀步扩展镜像也变得⾮常简单。此外,Docker 团队同各个开源项 ⽬团队⼀起维护了⼀⼤批⾼质量的 ,既可以直接在⽣产环境使⽤,⼜可以作为基础进⼀步定制, ⼤⼤的降低了应⽤服务的镜像制作成本。
安装Docker
###一键安装 curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun ###启动docker并设置自启 systemctl daemon-reload && systemctl restart docker && systemctl enable docker
Docker命令
### 镜像信息 docker version ### 查看帮助文档 docker 命令 --help ### docker信息 docker info
拉取镜像
### 默认拉取最新的镜像 docker pull nginx ### 指定版本下载 docker pull nginx:1.20.1
查看镜像
### 查看所有镜像信息 docker images -a ### 查看所有的镜像id docker images -aq [root@Docker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE test/static_web latest bfd4e845dd3b 8 minutes ago 167MB test/apache2 webserver 82fa16703f2f 13 minutes ago 111MB test/apache2 latest 399c521dd530 About an hour ago 321MB ubuntu latest d2e4e1f51132 6 days ago 77.8MB devopsil/puppet latest 31a474a2334e 4 years ago 321MB
列表解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的id
CREATE 镜像的创建时间
SIZE 镜像的大小
删除镜像
### 删除指定id的镜像
docker rmi 镜像id
### 删除指定名称的镜像
docker rmi nginx:1.20.1
### 迭代删除所有的镜像
docker rm -f IMAGE ID
启动容器
[root@Docker ~]# docker run --name gezi -d nginx:latest ff3a38fcfc2388ec60adb272cacdd94090fd05ec213be65f26bf3583ec1985d1 [root@Docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ff3a38fcfc23 nginx:latest "/docker-entrypoint.…" 6 seconds ago Up 5 seconds 80/tcp gezi
-
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-
-d: 后台运行容器,并返回容器ID;
-
-i: 以交互模式运行容器,通常与 -t 同时使用;
-
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-
--name="nginx-lb": 为容器指定一个名称;
-
--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
-
--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
-
-h "mars": 指定容器的hostname;
-
-e username="ritchie": 设置环境变量;
-
--env-file=[]: 从指定文件读入环境变量;
-
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
-
-m :设置容器使用内存最大值;
-
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
-
--link=[]: 添加链接到另一个容器;
-
--expose=[]: 开放一个端口或一组端口;
-
--volume , -v: 绑定一个卷
停止容器
### 启动已被停止的容器myrunoob
docker start myrunoob
### 停止运行中的容器myrunoob
docker stop myrunoob
### 重启容器myrunoob
docker restart myrunoob
进入容器
[root@Docker ~]# docker exec -it ff3a38fcfc23 /bin/bash root@ff3a38fcfc23:/# exit exit
-
-d :分离模式: 在后台运行
-
-i :即使没有附加也保持STDIN 打开
-
-t :
Dockfile
什么是 Dockerfile?
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
Dockerfile 常用指令
指令:FROM 功能描述:设置基础镜像 语法:FROM < image>[:< tag> | @< digest>] 指令:MAINTAINER 功能描述:设置镜像作者 语法:MAINTAINER < name> 指令:RUN 功能描述: 编译镜像时运行的脚本 语法:RUN < command> 指令:CMD 功能描述:设置容器的启动命令 语法:CMD [“executable”,”param1”,”param2”] CMD [“param1”,”param2”] CMD < command> 指令:LABEL 功能描述:设置镜像的标签 格式:LABEL < key>=< value> < key>=< value> … 指令:EXPOSE 功能描述:设置镜像暴露端⼝,记录容器启动时监听哪些端⼝ 语法:EXPOSE < port> < port> … 指令:ENV 功能描述:设置镜像中的环境变量 语法:ENV < key>=< value>…|< key> < value> 指令:ADD 功能描述:复制⽂件到镜像中 语法:ADD < src>… < dest>|[“< src>”,… “< dest>”] 指令:COPY 功能描述:复制⽂件到镜像中 语法:COPY < src>… < dest>|[“< src>”,… “< dest>”] 指令:VOLUME 功能描述:设置容器的挂载点 语法:VOLUME [“/data”] VOLUME /data1 /data2 指令:USER 功能描述:设置RUN CMD ENTRYPOINT的⽤户名或UID 语法:USER < name> 指令:WORKDIR 功能描述:设置RUN CMD ENTRYPOINT ADD COPY指令的⼯作⽬录 语法:WORKDIR < Path> 指令:ARG 功能描述:设置编译变量 语法:ARG < name>[=< defaultValue>] 指令:ONBUILD 功能描述:设置⾃径想的编译钩⼦指令 语法:ONBUILD [INSTRUCTION] 指令:STOPSIGNAL 功能描述:设置容器退出时,Docker Daemon向容器发送的信号量 语法:STOPSIGNAL signal
编写Dockerflie文件
[root@Dockerfile ~]# cat mydockerfile FROM centos:7 MAINTAINER gezi ENV MYPATH /usr/locat WORKDIR $MYPATH RUN yum -y install vim RUN yum -y install net-tools EXPOSE 80 CMD echo $MYPATH CMD echo"----end----" CMD /bin/bash ###命令 docker build -f dockerfile⽂件路径 -t 镜像名:[tag]版本号 [root@Dockerfile ~]# docker build -f mydockerfile -t mydockerfile:0.1 . ###出现就是成功 Successfully built 101bd3ba11eb Successfully tagged mydockerfile:0.1 [root@Dockerfile ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mydockerfile 0.1 101bd3ba11eb About a minute ago 591MB
CMD 和ENTRYPOINT 区别
CMD
[root@Dockerfile ~]# cat dockerfile-cmd-test FROM centos:7 CMD ["ls","-a"], [root@Dockerfile ~]# docker build -f dockerfile-cmd-test -t cmdtest . Sending build context to Docker daemon 20.48kB Step 1/2 : FROM centos:7 ---> eeb6ee3f44bd Step 2/2 : CMD ["ls","-a"], ---> Running in c2722c8ec79f Removing intermediate container c2722c8ec79f ---> d84fc5ccf558 Successfully built d84fc5ccf558 Successfully tagged cmdtest:latest [root@Dockerfile ~]# docker run d84fc5ccf558 . .. .dockerenv anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var [root@Dockerfile ~]# docker run d84fc5ccf558 -l docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "-l": executable file not found in $PATH: unknown.
cmd 的情况下 -l 替换了 [“ls”,"-a"] 这个命令,所以执⾏不成功 ,因为 l 并不是命令
ENTRYPOINT
[root@Dockerfile ~]# cat dockerfile-cmd-entrypoint FROM centos:7 ENTRYPOINT ["ls","-a"] [root@Dockerfile ~]# docker build -f dockerfile-cmd-entrypoint -t entoryonit-test . Sending build context to Docker daemon 22.02kB Step 1/2 : FROM centos:7 ---> eeb6ee3f44bd Step 2/2 : ENTRYPOINT ["ls","-a"] ---> Running in 4990e5dc2150 Removing intermediate container 4990e5dc2150 ---> 48b65f38019f Successfully built 48b65f38019f Successfully tagged entoryonit-test:latest [root@Dockerfile ~]# docker run 48b65f38019f . .. .dockerenv anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var [root@Dockerfile ~]# docker run 48b65f38019f -l total 12 drwxr-xr-x. 1 root root 6 May 11 07:30 . drwxr-xr-x. 1 root root 6 May 11 07:30 .. -rwxr-xr-x. 1 root root 0 May 11 07:30 .dockerenv -rw-r--r--. 1 root root 12114 Nov 13 2020 anaconda-post.log lrwxrwxrwx. 1 root root 7 Nov 13 2020 bin -> usr/bin drwxr-xr-x. 5 root root 340 May 11 07:30 dev drwxr-xr-x. 1 root root 66 May 11 07:30 etc drwxr-xr-x. 2 root root 6 Apr 11 2018 home lrwxrwxrwx. 1 root root 7 Nov 13 2020 lib -> usr/lib lrwxrwxrwx. 1 root root 9 Nov 13 2020 lib64 -> usr/lib64 drwxr-xr-x. 2 root root 6 Apr 11 2018 media drwxr-xr-x. 2 root root 6 Apr 11 2018 mnt drwxr-xr-x. 2 root root 6 Apr 11 2018 opt dr-xr-xr-x. 122 root root 0 May 11 07:30 proc dr-xr-x---. 2 root root 114 Nov 13 2020 root drwxr-xr-x. 11 root root 148 Nov 13 2020 run lrwxrwxrwx. 1 root root 8 Nov 13 2020 sbin -> usr/sbin drwxr-xr-x. 2 root root 6 Apr 11 2018 srv dr-xr-xr-x. 13 root root 0 May 10 01:04 sys drwxrwxrwt. 7 root root 132 Nov 13 2020 tmp drwxr-xr-x. 13 root root 155 Nov 13 2020 usr drwxr-xr-x. 18 root root 238 Nov 13 2020 var
定义镜像 tomcat
[root@Dockerfile ~]# cd /home/guardwhy/tomcat/ [root@Dockerfile tomcat]# ll 总用量 151056 -rw-r--r--. 1 root root 11560971 5月 9 18:19 apache-tomcat-9.0.62.tar.gz -rw-r--r--. 1 root root 641 5月 9 18:19 Dockerfile -rw-r--r--. 1 root root 143111803 5月 9 18:19 jdk-8u261-linux-x64.tar.gz -rw-r--r--. 1 root root 0 5月 9 18:19 readme.txt drwxr-xr-x. 3 root root 38 5月 9 18:32 test [root@Dockerfile tomcat]# pwd /home/guardwhy/tomcat ###创建Dockerfile与readme.txt 将jdk和tomcat安装的压缩包拷⻉
编写Dockerfile
[root@Dockerfile tomcat]# cat Dockerfile FROM centos:7 MAINTAINER gezi COPY readme.txt /usr/local/readme.txt ADD jdk-8u261-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-9.0.62.tar.gz /usr/local/ RUN yum -y install vim ENV MYPATH /usr/local WORKDIR $MYPATH ENV JAVA_HOME /usr/local/jdk1.8.0_261 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.62 ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.62 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin EXPOSE 8080 CMD /usr/local/apache-tomcat-9.0.62/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.62/bin/logs/catalina.out ###官⽅命名为Dockerfile,build会⾃动寻找这个⽂件,就不需要-f指定了 [root@Dockerfile tomcat]# docker build -t diytomcat
运⾏启动⾃定义镜像
[root@Dockerfile tomcat]# docker run \ > -d -p 9090:8080 --name mydiytomcat \ > -v /home/guardwhy/tomcat/test:/usr/local/apache-tomcat-9.0.62/webapps/test \ > -v /home/guardwhy/tomcat/tomcat9logs/:/usr/local/apache-tomcat-9.0.62/logs \ > --privileged=true diytomcat 4b7fea3d2b7e4582184804d7060ac9c88794593141ae5c2a29a55a135f584e0c [root@Dockerfile tomcat]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4b7fea3d2b7e diytomcat "/bin/sh -c '/usr/lo…" 15 seconds ago Up 14 seconds 0.0.0.0:9090->8080/tcp, :::9090->8080/tcp mydiytomcat
验证测试
链接访问: http://192.168.200.198:9090/
⽹⻚发布测试
[root@Dockerfile test]# pwd /home/guardwhy/tomcat/test [root@Dockerfile test]# cat index.jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>docker</title> </head> <body> <h3>鸽子</h3> <% System.out.println("hello, dockerlogs"); %> </body> </html> [root@Dockerfile test]# cd WEB-INF/ [root@Dockerfile WEB-INF]# cat web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> </web-app>
测试
点击链接: http://192.168.200.198:9090/test/
发布镜像到到阿里云
[root@Dockerfile ~]# docker login --username=aliyun4*******7 registry.cn-qingdao.aliyuncs.com Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded [root@Dockerfile ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE entoryonit-test latest e0c2fbd5f692 40 minutes ago 231MB <none> <none> 48b65f38019f 41 minutes ago 204MB cmdtest latest d84fc5ccf558 47 minutes ago 204MB entoryonit-txt latest d84fc5ccf558 47 minutes ago 204MB mydockerfile 0.1 101bd3ba11eb 53 minutes ago 591MB centos 8 a3012f8ca5c6 31 hours ago 830MB diytomcat latest 84ea295ec349 46 hours ago 793MB centos 7 eeb6ee3f44bd 7 months ago 204MB centos latest 5d0da3dc9764 7 months ago 231MB [root@Dockerfile ~]# docker tag 84ea295ec349 registry.cn-qingdao.aliyuncs.com/docker-guardwhy/java-test:7 [root@Dockerfile ~]# docker push registry.cn-qingdao.aliyuncs.com/docker-guardwhy/java-test:7 The push refers to repository [registry.cn-qingdao.aliyuncs.com/docker-guardwhy/java-test] bf329e13ce98: Preparing 9c3748394bf6: Preparing ed36d71ad66b: Preparing c8615d250547: Preparing 174f56854903: Preparing denied: requested access to the resource is denied
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?