【Docker】Docker从入门到加班

191 阅读4分钟

填个坑

Docker是什么?

Docker 属于 Linux 容器的一种封装,提供一整套虚拟运行环境,提供简单易用的容器使用接口。Docker能将应用程序部署到虚拟容器中,让程序可以在这个虚拟容器中运行,与外界环境隔离。

Docker架构

Docker更详细的架构如图所示,采用CS架构,client通过RESTFUL API发送docker命令到docker daemon进程,docker daemon进程执行镜像编译,容器启停以及分发,数据卷管理等,一个client可以与多个docker daemon通信。

在这里插入图片描述

  • Docker Daemon:Docker后台进程,用于管理镜像,容器以及数据卷。
  • Docker Client:用于与Docker Daemon交互。
  • Docker Registry:用于存储Docker镜像,类似github,公共的Registry有Docker Hub和Docker Cloud。
  • Images:镜像是用于创建容器的一种只读模板。镜像通常基于一个基础镜像,在此基础上安装额外的软件。比如你的nginx镜像可能基于debian然后安装nginx并添加配置,你可以从Docker Hub上拉取已有的镜像或者自己通过Dockerfile来编译一个镜像。
  • Containers:容器是镜像的一个可运行示例,我们可通过Docker client或者API来创建,启停或者删除容器。默认情况下,容器与宿主机以及其他容器已经隔离,当然你可以控制隔离容器的网络或者存储的方式。
  • Services:服务是docker swarm引入的概念,可以用于在多宿主机之间伸缩容器数目,支持负载均衡已经服务路由功能。

Docker解决的问题

  • 解决在服务器部署时的环境问题
    • 一个程序部署在各个服务器,jdk,mysql版不一致等等
    • 一个程序需要的依赖有的没有
  • 解决传统虚拟机的痛点
    • 占资源多
    • 步骤冗余
    • 启动慢

Docker语法

镜像操作

查看本地所有镜像

  • docker images/docker image ls

删除本地镜像

  • docker image rm [image id]/docker rmi [image id]

使用dockerfile创建本地镜像

  • docker build

查看指定镜像的创建历史

  • docker history [OPTIONS] IMAGE

从归档文件中创建镜像

  • dcoker import

容器生命周期管理

创建一个新的容器并运行一个命令

  • docker run --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行; --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致; --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致; --env-file=[]: 从指定文件读入环境变量; --expose=[]: 开放一个端口或一组端口; --link=[]: 添加链接到另一个容器; --name="nginx-lb": 为容器指定一个名称; --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型; --volume , -v: 绑定一个卷 -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项; -d: 后台运行容器,并返回容器ID; -e username="ritchie": 设置环境变量; -h "mars": 指定容器的hostname; -i: 以交互模式运行容器,通常与 -t 同时使用; -m :设置容器使用内存最大值; -p: 指定端口映射,格式为:主机(宿主)端口:容器端口 -P: 随机端口映射,容器内部端口随机映射到主机的端口 -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用; 启动容器

启动/停止/重启容器

  • docker start/stop/restart

删除容器

  • docker rm rm -f 强制删除 docker rm -v 删除容器以及挂在卷 docker rm $(docker ps -a -q) 删除所有停止的容器

杀掉一个运行中的容器

  • docker kill

暂停/恢复容器

  • docker pause/unpause

创建一个新的容器但不启动它

  • docker create

在容器内部额外启动新进程

  • docker exec

容器操作

展示所有容器

  • docker ps -a

查看docker元数据

  • docker inspect

容器中的进程信息

  • docker top

连接到正在运行中的容器

  • docker attach

docker事件

  • docker events

容器的日志

  • docker logs

阻塞运行直到容器停止,然后打印出它的退出代码。

  • docker wait

到处docker容器为一个tar文件

  • docker export

docker端口映射

  • docker port

一个或者多个容器的统计信息

  • docker stats

docker hub

登陆

  • docker login -u 用户名 -p 密码

登出

  • docker logout

拉取镜像

  • docker pull java

推送镜像

  • docker push myapache:v1

从Docker Hub查找镜像

  • docker search java

dockerfile

  • cmd
    • 启动被容器时,要运行的命令
    • 会被docker run 覆盖
    • 只能被使用一次
  • entrypoint
    • docker run 命令会追加,不会覆盖
  • workdir
    • 指定工作目录,cmd,entrypoint都在该路径下执行
  • env
    • 设置环境变量
  • user
    • 什么用户去运行
  • volume
    • 添加卷
  • add
    • 复制构建环境下的内容进镜像
  • copy
    • 复制文件进镜像
  • label
    • 为docker添加元数据
  • stopsignal
    • 停止容器的时候发送什么信号给系统
  • arg
    • 运行时变量
  • onbuild
    • 该镜像被作为基础镜像后,执行

应用

初始入门 使用hello-world镜像

  • 输入docker run hello-world
MacBook-Pro ~ % docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete 
Digest: sha256:1a523af650137b8accdaed439c17d684df61ee4d74feac151b5b337bd29e7eec
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/

部署MySQL

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b5NdCb6c-1610296383422)(/Users/chenhui/Library/Application Support/typora-user-images/image-20210110214500437.png)]

  • 从docker hub上看到了使用教程,下面根据这个来操作

docker run -p 3310:3306 -itd -e MYSQL_ROOT_PASSWORD=123456 mysql

  • docker测试连接成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UGF7Vd42-1610296383423)(/Users/chenhui/Library/Application Support/typora-user-images/image-20210110221213525.png)]

dockerfile使用

  • 新建一个目录,放入jar包

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pTv8ecRr-1610296383426)(/Users/chenhui/Library/Application Support/typora-user-images/image-20210110233211514.png)]

  • dockerfile中写入
FROM java:8
MAINTAINER chenhui
VOLUME /tmp
COPY demo111-0.0.1-SNAPSHOT.jar /app/demo111-0.0.1-SNAPSHOT.jar
WORKDIR /app
EXPOSE 7777
ENTRYPOINT ["nohup","java","-jar","demo111-0.0.1-SNAPSHOT.jar","&"]

  • 执行docker build -t dockerdemo . 构建自己的镜像可以看到构建成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yxWtbGvR-1610296383427)(/Users/chenhui/Library/Application Support/typora-user-images/image-20210110233434907.png)]

  • 执行docker run -p 7777:7777 -d dockerdemo启动成功

Docker network的使用

  • 创建docker network docker network create my-net

  • 添加mysql容器进入my-net docker network connect my-net gallant_cartwright 在这里插入图片描述

  • 添加成功 在这里插入图片描述

  • 查看mysql容器的hosts

docker exec -it  gallant_cartwright /bin/bash
more /etc/hosts

在这里插入图片描述

  • springboot配置文件修改 在这里插入图片描述
  • 再次打包启动自定义容器,启动容器 在这里插入图片描述 在这里插入图片描述

springboot就一个简单的queryAll,这里就不贴代码了

参考资料 www.runoob.com/docker/dock…