Docker入门实践

时间:2021-09-05
本文章向大家介绍Docker入门实践,主要包括Docker入门实践使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

介绍

Docker 实现了一种轻量的虚拟化技术

Docker 是基于 cGroup,namespace 等 Linux 内核技术实现对 Linux Container 的管理引擎

概念

Docker: Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

Docker Container: Docker 容器由 Docker 镜像创建,Docker 容器持有应用程序运行所需要的所有环境。Docker 容器有 run,started,stopped,moved,和 deleted 这几种状态,每一个容器是一个隔离的,安全的应用程序运行平台,Docker 容器是 Docker 运行的组件。

Docker Image: 一个 Docker 镜像是一个只读的模板,例如,一个容器可以包含一个 Ubuntu 操作系统和 Apache 程序。一个 Docker 镜像可以用来创建多个 Docker 容器。Docker 提供了简单的方式去编译一个新的 Docker 镜像或者更新一个新的镜像,同时可以从 Docker Registry 下载不同的镜像。

Docker Registry: Docker 仓库是 Docker 官方提供的一个开源程序,用来存储和分发 Docker 镜像。

Docker Hub: Docker 官方提供的公有 Docker Registry。

Docker 安装, 验证

Linux、windows都支持

Docker服务验证:

windows在powershell 下运行命令:

PS C:\Users\aa> docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:7d91b69e04a9029b99f3585aaaccae2baa80bcf318f4a5d2165a9898cd2dc0a1
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

打包应用程序到Docker镜像中

在 Docker 容器中访问文件有两种方式:

• 一种不用拷贝文件到 Docker image,直接在 Docker container 启动的时候 mount 到 Docker container 中(docker run -v /host_data:/container_dir)

• 另一种就是 build Docker image 的时候直接将相关文件拷贝到 Docker image 中

以 Docker image 方式发布整个应用程序的场景来说,需要构建一个新的 Docker image 并且将所有相关文件和运行时依赖拷贝到 Docker image 中

使用 Dockerfile 来构建 Docker Image。

常用Docker 命令:

1、docker run :创建一个新的容器并运行一个命令
2、docker start :启动一个或多个已经被停止的容器
3、docker stop :停止一个运行中的容器
4、docker restart :重启容器
5、docker rm :删除一个或多少容器
6、docker create :创建一个新的容器但不启动它
7、docker exec:在运行的容器中执行命令
8、docker ps : 列出容器
9、docker commit :从容器创建一个新的镜像。
10、docker pull : 从镜像仓库中拉取或者更新指定镜像
11、docker push : 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
12、docker search : 从Docker Hub查找镜像
13、docker images : 列出本地镜像
14、docker images : 列出本地镜像
15、docker info : 显示 Docker 系统信息,包括镜像和容器数。
16、docker version :显示 Docker 版本信息

Dockfile

Dockfile是一个用于编写docker镜像生成过程的文件

Dockefile语法:

FROM:指定一个构建镜像的基础源镜像,如果本地没有就会从公共库中拉取,没有指定镜像的标签会使用默认的latest标签,可以出现多次,如果需要在一个Dockerfile中构建多个镜像

MAINTAINER:描述镜像的创建者,名称和邮箱

RUN: 用法:RUN "command" "param1" "param2" ,RUN命令是一个常用的命令,执行完成之后会成为一个新的镜像,这里也是指镜像的分层构建

CMD: 用法:CMD command param1 param2, CMD在Dockerfile中只能出现一次,有多个,只有最后一个会有效

EXPOSE:用法:EXPOSE [...], 告诉Docker服务器容器对外映射的容器端口号,在docker run -p的时候生效

ENV: 用法: ENV只能设置一个, EVN =允许一次设置多个; 设置容器的环境变量,可以让其后面的RUN命令使用,容器运行的时候这个变量也会保留

ADD: 用法:ADD, 复制本机文件或目录或远程文件,添加到指定的容器目录,支持GO的正则模糊匹配。

COPY: 用法:COPY, COPY除了不能自动解压,也不能复制网络文件。其它功能和ADD相同
ENTRYPOINT: 用法:ENTRYPOINT "command" "param1" "param2" , 这个命令和CMD命令一样,唯一的区别是不能被docker run命令的执行命令覆盖,如果要覆盖需要带上选项--entrypoint,如果有多个选项,只有最后一个会生效。

VOLUME: 用法:VOLUME ["path"], 在主机上创建一个挂载,挂载到容器的指定路径, docker run -v命令也能完成这个操作,而且更强大

USER: 用法:USER daemon, 指定运行容器时的用户名或UID,后续的RUN、CMD、ENTRYPOINT也会使用指定的用户运行命令

WORKDIR: 用法:WORKDIR path, 为RUN、CMD、ENTRYPOINT指令配置工作目录

ONBUILD: 用法:ONBUILD [INSTRUCTION], 镜像创建后,如果其它镜像以这个镜像为基础,会先执行这个镜像的ONBUILD命令

每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的

构建SpringBoot 项目镜像

  1. 编译打包准备部署的Springboot 包

  2. 在项目根目录下边下Dockerfile 文件

#java:8 是使用jdk版本
FROM java:8
  
#添加jar到容器并重命名
ADD dubbo-web/target/dubbo-web-0.0.1-SNAPSHOT.jar /app.jar

#执行jar文件
ENTRYPOINT ["java","-jar","/app.jar"]
  1. 使用docker build命令生成镜像
>docker build -t monitor-alarm .
Sending build context to Docker daemon  101.2MB
Step 1/3 : FROM java:8
8: Pulling from library/java
5040bd298390: Pull complete
fce5728aad85: Pull complete
76610ec20bf5: Pull complete
60170fec2151: Pull complete
e98f73de8f0d: Pull complete
11f7af24ed9c: Pull complete
49e2d6393f32: Pull complete
bb9cdec9c7f3: Pull complete
Digest: sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d
Status: Downloaded newer image for java:8
 ---> d23bdf5b1b1b
Step 2/3 : ADD dubbo-web/target/dubbo-web-0.0.1-SNAPSHOT.jar /app.jar
 ---> a657bb2d605e
Step 3/3 : ENTRYPOINT ["java","-jar","/app.jar"]
 ---> Running in 577af7d5bc0c
Removing intermediate container 577af7d5bc0c
 ---> 58706e8fd73d
Successfully built 58706e8fd73d
Successfully tagged monitor-alarm:latest
  1. 查看本地镜像仓库
docker images

REPOSITORY                                                  TAG                 IMAGE ID            CREATED              SIZE
monitor-alarm                                               latest              58706e8fd73d        About a minute ago   711MB
hello-world                                                 latest              d1165f221234        6 months ago         13.3kB
  1. 运行本地容器
    docker run -d -p
    -d: 后台运行
    -p: 8080是指在doucker暴露在外部的端口,80是指docker里面的项目的端口
docker run -d -p 8080:80 monitor-alarm   

47e20eda38cd35c4ef5e7f794025ab645ed237976373bff870cb5a769b798ca6
  1. 使用docker ps 查看运行容器状态信息
PS C:\Users\aa> docker ps
	CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                  NAMES
	47e20eda38cd        monitor-alarm       "java -jar /app.jar"   10 seconds ago      Up 10 seconds       0.0.0.0:8080->80/tcp   compassionate_jennings
  1. 项目访问

    使用我们的机器ip以及暴露外部的映射端口8080访问

  2. 查看服务的日志

docker logs --tail 10 47e20eda38cd        
   
2021-09-05 04:11:49.373  INFO 1 --- [.27.2.210:2181)] org.apache.zookeeper.ClientCnxn          : Client session timed out, have not heard from server in 12002ms for sessionid 0x0, closing socket connection and attempting reconnect
   2021-09-05 04:11:49.473  INFO 1 --- [.27.3.210:2181)] org.apache.zookeeper.ClientCnxn          : Opening socket connection to server 10.27.3.210/10.27.3.210:2181. Will not attempt to authentic
  1. 停掉服务, stop 加上容器id
docker stop 47e20eda38cd      
  1. 删除容器, 必须是停止状态才可以删除
docker rm 47e20eda38cd
  1. 查看容器进程
docker top 47e20eda38cd

本文来自博客园,作者:chaplinthink,转载请注明原文链接:https://www.cnblogs.com/bigdata1024/p/15230513.html

原文地址:https://www.cnblogs.com/bigdata1024/p/15230513.html