logo

玩转 Docker

wangzf / 2021-03-17


目录

Docker 历史

Docker 概述

Docker 是基于 Go 语言开发的一个开源项目

Docker 能做什么

Docker Platform

Docker Engine

docker

Docker 是一个客户端-服务器应用程序, 具有以下组件:

Docker 架构

docker中有这样几个概念:

实际上你可以简单的把image理解为可执行程序,container就是运行起来的进程。

那么写程序需要源代码,那么“写”image就需要dockerfile, dockerfile就是image的源代码,docker就是"编译器"。

因此我们只需要在dockerfile中指定需要哪些程序、依赖什么样的配置, 之后把dockerfile交给“编译器”docker进行“编译”,也就是docker build 命令, 生成的可执行程序就是image,之后就可以运行这个image了,这就是docker run命令, image运行起来后就是docker container。

Docker 架构概述

Docker 使用客户端-服务器架构:

docker

Docker 客户端与 Docker 守护进程进行交互, 其中:

Docker Client(客户端) – docker

DOCKER_HOST

Docker daemon(守护进程) – docked

Docker Object(对象)

Docker Registry(仓库)

Docker Services

docker run 命令示例

运行一个 ubuntu 容器

$ docker run -i -t ubuntu /bin/bash
  1. 如果 ubuntu 在本地没有镜像, Docker 会从已配置的仓库中拉取, 等同于:
docker pull ubuntu
  1. Docker 会创建一个新容器, 等同于:
docker container create
  1. Docker 将一个读写文件系统分配给容器, 作为其最后一层. 这允许运行中的容器在其本地文件系统中创建或修改文件和目录
  2. Docker 创建了一个网络接口, 将容器连接到默认网络, 因为您未指定任何网络选项. 这包括为容器分配 IP 地址. 默认情况下, 容器可以使用主机的网络连接连接到外部网络
  3. Docker 启动容器并执行 /bin/bash. 因为容器是交互式运行的, 并且已附加到您的终端(由于 -i-t 标志), 所以您可以在输出记录到终端时使用键盘提供输入
  4. 当键入 exit 以终止 /bin/bash 命令时, 容器将停止但不会被删除. 您可以重新启动或删除它

Docker 底层技术

Docker 是一个 Client-Server 结构的系统, Docker 的守护进程(Docker daemon)运行在主机(Docker Server)上, 通过 Socket 从客户端(Docker Client[docker CLI, REST API])访问, Docker Server 接收到 Docker Client 的指令, 就去执行这个命令.

Docker 用 Go 编程语言编写, 并利用 Linux 内核的多个功能来交付其功能.

Docker 安装

环境查看

# 系统内核
$ uname -a

# 系统配置
$ cat /etc/os-release
$ uname -a

Dcoker 安装

macOS

  1. 安装 Docker Desktop
  2. 卸载 Docker Desktops

Ubuntu

  1. 删除旧版本
$ sudo apt-get remove docker docker-engine docker.io containerd runc
  1. 设置存储库
# 1.更新apt软件包索引并安装软件包以允许apt通过HTTPS使用存储库
$ sudo apt-get update
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

# 2.添加Docker的官方GPG密钥
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88

# 3.设置稳定的存储库
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  1. 安装 Docker Engine
# 1.更新apt软件包索引
$ sudo apt-get update

# 2.安装最新版本的Docker Engine和容器化的容器, 或转到下一步以安装特定版本
$ sudo apt-get install \
    docker-ce 
    docker-ce-cli 
    containerd.io

# 3.查看可用的仓库版本(如果想安装特定版本的Docker Engine)
$ apt-cache madison docker-ce
$ sudo apt-get install \
    docker-ce=<VERSION_STRING> \
    docker-ce-cli=<VERSION_STRING> \
    containerd.io
  1. 运行 hello-world
# 启动 Docker
$ systemctl start docker
$ docker version

# 运行 hello-world
$ docker run --help
$ sudo docker run hello-world

# 查看下载的 image
$ docker images
  1. 升级 Docker Engine
# 按照安装说明进行
$ sudo apt-get update
  1. 卸载 Docker Engine
$ sudo apt-get purge docker-ce docker-ce-cli containerd.io
$ sudo rm -rf /var/lib/docker

NOTE

customized configuration files 需要手动删除

Windows

Docker Desktop 使用

查看 Docker 版本

$ docker version

版本信息:

Client: Docker Engine - Community
 Cloud integration: 1.0.12
 Version:           20.10.5
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        55c4c88
 Built:             Tue Mar  2 20:13:00 2021
 OS/Arch:           darwin/amd64
 Context:           default
 Experimental:      true
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

运行 hello-world 容器

docker

$ docker run -d -p 80:80 docker/getting-started
# or
$ docker run -dp 80:80 docker/getting-started

构建 App 容器、镜像

  1. 下载 App

  2. 构建 App 的容器镜像

    • (1)在 package.json 所在目录下创建 Dockerfile 文件, 内容如下

      FROM node:12-alpine
      WORKDIR /app
      COPY . .
      RUN yarn install --production
      CMD ["node", "src/index.js"]
      
    • (2)构建容器镜像

      $ docker build -t getting-started .
      
      • -t: 为镜像打一个可读性好的标签
      • .: Docker 在当前目录下寻找 Dockerfile 文件
  3. 启动 App 容器

    • (1) 启动 App 容器

      $ docker run -dp 3000:3000 getting-started
      
    • (2)查看 App

      • http://localhost:3000/
  4. 更新 App

    • (1)更改 App 源代码

    • (2)重新构建更新后的镜像

      $ docker build -t getting-started .
      
    • (3)停止旧容器

      • 命令行模式:

        # 查看正在运行的容器 ID
        $ docker ps
        
        # Swap out <the-container-id> with the ID from docker ps
        $ docker stop <the-container-id>
        $ docker stop -f <the-container-id>
        
      • Docker Dashboard 模式

    • (3)删除旧容器

      • 命令行模式

        $ docker rm <the-container-id>
        $ docker rm -f <the-container-id> 
        
      • Docker Dashboard 模式

    • (4)开启新的容器

      $ docker run -dp 3000:3000 getting-started
      
    • (5)查看 App

      • http://localhost:3000/

分享 App

  1. 创建一个 Repo

  2. Push 镜像

    • (1)查看镜像

      $ docker image ls
      
    • (2)登录到 Docker Hub

      $ docker login -u zfwang
      
    • (3)为 getting-started 镜像创建一个新标签

      $ docker tag getting-started zfwang/getting-started
      
    • (4)Push 镜像

      $ docker push zfwang/getting-started
      
  3. 在一个新的实例中运行镜像

    • (1) Play with Docker <https://labs.play-with-docker.com/>_

    • (2) 登录 Docker Hub 账号

    • (3) + ADD NEW INSTANCE

    • (4) 运行容器

      $ docker run -dp 3000:3000 YOUR-USER-NAME/getting-started
      

持久化数据库

  1. 容器的文件系统

  2. 启动一个 ubuntu 容器, 并创建一个文件 /data.txt

    $ docker run -d ubuntu zsh -c "shuf -i 1-10000 -n 1 -o /data.txt && tail -f /dev/null"
    
  3. 在 Docker Desktop 中打开 ubuntu 容器中的 CLI

    $ cat /data.txt
    

NOTE

  1. 启动另一个 ubuntu 容器(使用同一个 image)

    $ docker run -it ubuntu ls /
    
  2. 删除第一个容器

    $ docker rm -f <container-id>
    

Docker 命令

docker

docker help

$ docker version
$ docker -f args
$ docker --kubeconfig args
$ docker info
$ docker <command> --help

docker 镜像命令

docker images 查看镜像

$ docker images
$ docker images -a
$ docker images -q
$ docker images -aq

docker search 搜索镜像

$ docker search mysql
$ docker search --filter=STARS=3000

docker pull 下载镜像

$ docker pull <image>
$ docker pull <image>:<tag/version>

# <adderss>: 镜像实际地址
$ docker pull <address>

NOTE

docker remove 删除镜像

# 删除指定容器
$ docker rmi -f <images-id>

# 删除多个容器
$ docker rmi -f <images-id> <images-id> <images-id>

# 删除全部镜像
$ docker rmi -f $(docker images -aq)

docker 容器命令

新建容器并使用

# 下载镜像
$ docker pull centos

# 启动并进入容器
$ docker run [可选参数] image
$ docker run -it centos /bin/bin

退出容器

$ exit            # 从容器退回主机
$ Ctrl + P + Q    # 容器不停止退出

查看容器

$ docker ps       # 查看正在运行的容器
$ docker ps -a    # 列出当前正在运行的容器 + 带出历史运行过的容器
$ docker ps -n=?  # 最近创建的容器
$ docker ps -q    # 只显示容器的编号

删除容器

$ docker rm 容器id                 # 删除指定的容器, 不能删除正在运行的容器
$ docker rm -f ${docker ps -aq}   # 删除所有容器(包含正在运行的容器)
$ docker ps -a -q|xargs docker rm # 删除所有容器(包含正在运行的容器)

启动、停止容器

$ docker start 容器id
$ docker restart 容器id
$ docker stop 容器id
$ docker kill 容器id

其他常用命令

后台启动容器

$ docker run -d 镜像名
$ docker run -d centos
$ docker ps

NOTE

docker ps 会有问题, 发现 centos 停止了:

查看日志命令

$ docker logs --help
$ docker logs -tf --tail n 容器id

# 自己写一段脚本
$ docker run -d centos /bin/sh -C "while true;do echo wangzhefeng;sleep 1;done"
$ docker ps
$ docker logs -tf tail 10 容器id

查看容器中的进程信息

$ docker top --help
$ docker top 容器id

查看容器的元命令

$ docker inspect --help
$ docker inspect 容器id

进入正在运行的容器

# 方式一: 新建一个命令行窗口
$ docker exec -it 容器id /bin/bash

# 方式二: 不新建一个命令行窗口
$ docker attach 容器id

从容器内拷贝文件到主机上

$ docker cp 容器id:容器内路径 目的地主机地址

从主机内拷贝文件到容器上

$ todo

docker 命令练习

docker 安装 Nginx

1.搜索镜像

$ docker search nginx

2.下载镜像

$ docker pull nginx

3.查看镜像

$ docker images

4.启动容器

$ docker run -d --name nginx01 -p 3344:80 nginx

5.查看容器

$ curl localhost:3344

6.端口暴露的概念

docker 安装 Tomcat

1.搜索镜像

$ docker search tomcat

2.下载镜像


$ docker pull tomcat

# 停止容器后, 容器还可以查到, 一般用来测试, 用完即删除
$ docker run -it --rm tomcat:9.0

3.查看镜像

$ docker images

4.启动容器

$ docker run -d --name tomcat01 -p 3355:8080 tomcat

5.查看容器

https://localhost:3355

6.进入容器, 查看 tomcat

$ docker exec -it tomcat01 /bin/bash

docker 安装 ES + Kibana

  1. 搜索镜像
$ docker search elasticsearch
  1. 下载镜像
$ docker pull elasticsearch
  1. 查看镜像
$ docker images
  1. 启动容器
$ docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e 
  1. 查看容器
$ docker 

Docker 镜像

容器数据卷

Docker 网络原理

Docker Compose

Docker Swarm

CI/CD jenkins

IDEA 整合 Docker

Docker 安装环境

Docker 安装 Ubuntu

1.查看可用的 Ubuntu 版本

2.拉取最新版的 Ubuntu 镜像

docker pull ubuntu
docker pull ubuntu:latest

3.查看本地镜像

docker images

4.运行容器

docker run -itd --name ubuntu-test ubuntu

5.安装成功

docker ps

Docker 安装 Python

Docker 安装 TensorFlow

Docker 安装 PyTorch

Docker 使用示例

公司工作站环境

  1. 查看容器
$ sudo docker ps -a
  1. 开启 TensorFlow 环境
$ sudo docker attach tf_env
  1. 数据目录
$ cd /workspace/dataSets
  1. 退出 TensorFlow Docker(容器还在运行)
$ Ctrl + P + Q

NOTE

参考