Docker基础

Docker

什么是Docker

Docker 最初是 dotCloud 公司创始⼈ 在法国期间发起的⼀个公司内部项⽬,它是基于 dotCloud 公司多年云服务技术的⼀次⾰新,并于 ,主要项⽬代码在 上进⾏维护。Docker 项⽬后来还加⼊ 了 Linux 基⾦会,并成⽴推动 。 Docker ⾃开源后受到⼴泛的关注和讨论,⾄今其 已经超过 5 万 7 千个星标和⼀万多个 fork。甚 ⾄由于 Docker 项⽬的⽕爆,在 2013 年底,。Docker 最初是在 Ubuntu 12.04 上开发实现的; Red Hat 则从 RHEL 6.5 开始对 Docker 进⾏⽀持;Google 也在其 PaaS 产品中⼴泛应⽤ Docker。

为什么要用Docker

作为⼀种新兴的虚拟化⽅式,Docker 跟传统的虚拟化⽅式相⽐具有众多的优势。

更⾼效的利⽤系统资源

由于容器不需要进⾏硬件虚拟以及运⾏完整操作系统等额外开销,Docker 对系统资源的利⽤率更 ⾼。⽆论是应⽤执⾏速度、内存损耗或者⽂件存储速度,都要⽐传统虚拟机技术更⾼效。因此,相 ⽐虚拟机技术,⼀个相同配置的主机,往往可以运⾏更多数量的应⽤。

更快速的启动时间

传统的虚拟机技术启动应⽤服务往往需要数分钟,⽽ Docker 容器应⽤,由于直接运⾏于宿主内 核,⽆需启动完整的操作系统,因此可以做到秒级、甚⾄毫秒级的启动时间。⼤⼤的节约了开发、 测试、部署的时间。

⼀致的运⾏环境

开发过程中⼀个常⻅的问题是环境⼀致性问题。由于开发环境、测试环境、⽣产环境不⼀致,导致 有些 bug 并未在开发过程中被发现。⽽ Docker 的镜像提供了除内核外完整的运⾏时环境,确保 了应⽤运⾏环境⼀致性,从⽽不会再出现 「这段代码在我机器上没问题啊」 这类问题。

持续交付和部署

对开发和运维⼈员来说,最希望的就是⼀次创建或配置,可以在任意地⽅正常运⾏使⽤Docker 可以通过定制应⽤镜像来实现持续集成、持续交付、部署。开发⼈员可以通过 来进 ⾏镜像构建,并结合 系统进⾏集成测试,⽽运维⼈员则可以直接在⽣产环境中快速部署该镜像, 甚⾄结合 系统进⾏⾃动部署。 ⽽且使⽤ 使镜像构建透明化,不仅仅开发团队可以理解应⽤运⾏环境,也⽅便运维团队理解应⽤ 运⾏所需条件,帮助更好的⽣产环境中部署该镜像。

更轻松的迁移

由于 Docker 确保了执⾏环境的⼀致性,使得应⽤的迁移更加容易。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
复制代码

 


 
 
posted @   鸽子咕咕咕  阅读(470)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
点击右上角即可分享
微信分享提示