准备docker环境

安装在ubuntu环境下。
在安装Docker Engine-Community前,先设置docker仓库,之后可以从仓库安装和更新docker。
添加docker的官方GPG密钥。

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

通过搜索指纹的后八个字符,验证是否拥有带指纹的密钥。
在这里插入图片描述
设置稳定版仓库。

sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) \
  stable"

安装最新版的docker engine community和containerd。

sudo apt-get install docker-ce docker-ce-cli containerd.io

将非root用户加入docker组。

sudo usermod -aG docker your-user

检查docker安装。
在这里插入图片描述
在国内使用docker时速度通常比较慢,可以设置加速。
在这里插入图片描述

运行第一个容器

运行镜像。
在这里插入图片描述

基本操作

关于 -i,-t参数:
-t让docker分配一个伪终端并绑定到容器的标准输入上, -i则让容器的标准输入保持打开。
Docker中系统镜像的缺省命令是 bash,如果不加 -ti bash 命令执行了自动会退出。这是因为如果没有衔接输入流,本身就会马上结束。加-ti 后docker命令会为容器分配一个伪终端,并接管其stdin/stdout支持交互操作,这时候bash命令不会自动退出。
运行ubuntu镜像。
在这里插入图片描述
输入linux命令可以与容器交互,使用ctr+d来退出容器。
在这里插入图片描述
显示本地镜像库的内容。
在这里插入图片描述
获得帮助。
在这里插入图片描述
docker在架构上包括三个基本概念:
镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
仓库(Repository):仓库可看着一个代码控制中心,用来保存镜像。

在管理镜像,容器,网络,存储上,有一些常用命令应该掌握:
container:

docker container ls -aq #所有container的id, 简写 docker ps -aq
docker container ls -a | awk {'print$1'}
docker rm $(docker container ls -aq --filter name=web) #docker rm 是docker container rm的简写
docker container ls -f "status=exited" -q #列出所有已经退出的container的id
 
 
docker run -d --name=demo [imageId]
docker exec -it [containerId] /bin/bash
docker start [containerId]
docker inspect [containerId] #显示container的详细信息
docker logs [containerId] #查看container的日志
docker stop [containerId]
docker rm [containerId]
 
#从container的改变中得到一个新的image,docker commit是docker container commit 的简写
docker commit [containerName] [dockerid]/[imageid]

image:

#查看镜像
docker image ls
#删除镜像 
docker image rm mysql
#通过名字查找仓库中镜像 
docker search nginx
#下载镜像
docker image pull nginx
#查看镜像的详情 
docker image inspect nginx

volume:

docker volume ls
docker volume inspect
docker volume rm [volumeId]
#给volume指定可读性的名字,如果已经存在名字为mysql的volume会直接使用
docker run -d -v mysql:/var/lib/mysql --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql 
 
docker run -v [host-path]:[container-path] #文件是同步的,

network:

docker network ls
docker network inspect [networkId]
docker network inspect bridge
docker network create -d bridge my-bridge
#同一个network namespace中的container可以直接通过container-name交互
docker network connect my-bridge test1
 
docker run --name web -d -p 80:80 nginx
#-e用来设置环境变量,--link设置network namespace
docker run -d --link redis --name python-redis  -e REDIS_HOST=redis hurricane123/python-redis 
 
#可以使用工具brctl查看当前的网络拓扑
yum install brctl
brctl show

显示运行中的容器/显示所有容器。
在这里插入图片描述
继续运行原容器并进入。

docker restart 
dock attach
MySQL与容器化

查看可用版本。

docker search mysql

拉取mysql的镜像。

docker pull mysql:5.7

查看是否已经安装。
在这里插入图片描述
构建docker镜像练习。
创建一个目录,新建dockerfile,录入内容。
在这里插入图片描述
FROM:指定基础镜像。
CMD:容器启动命令。
ENTRYPOINT:入口点,同CMD,指定容器启动程序及参数。
通过–entrypoint 参数在运行时替换。
使用CMD要在运行时重新写命令才能追加运行参数,ENTRYPOINT则可以运行时接受新参数。

运行镜像。

在这里插入图片描述
使用MySQL容器。
启动服务器。

sudo docker run -p 3307:3306 --name mysql2 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

这里的-p选项是把容器的端口映射到主机端口。
在这里插入图片描述
启动客户端。
在这里插入图片描述
Dockerfile 的 VOLUME /var/lib/mysql 的含义:
每次启动 mysql 容器,docker 创建一个文件卷挂载在容器内/var/lib/mysql位置。这个卷在主机(host)的 /var/lib/docker/volumes/ 目录下。
在这里插入图片描述
在这里插入图片描述
创建卷并挂载。
在这里插入图片描述
在这里插入图片描述
这里没有暴露端口给主机。
启动客户端容器连接服务器。
在这里插入图片描述
这里使用了 --link 连接两个容器。
客户端容器内可以使用 mysql 这个别名访问服务器 。
在这里插入图片描述
挂载现有数据库操作同上。

docker run -v "$PWD/data":/var/lib/mysql --user 1000:1000 --name some-mysql -e MYSQL_ROOT_PASSWORD=m
#修改容器配置
docker run --name some-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d 

编写stack.yml。
在这里插入图片描述
使用docker-compose(容器编排的原型)启动服务。
在这里插入图片描述

Docker网络

管理容器网络。
在这里插入图片描述
docker-compose为每个应用建立自己的网络。默认bridge不好?
按照一般的思维,docker默认提供的bridge网络与用户自定义的bridge网络之间,在功能上应该没有什么区别,但实际情况与此相反,两者之间存在着一些不同,假设有两个容器连接在同一个bridge网络之上,在网络是默认的与用户自定义的情况下的一些不同点:

默认bridge网络用户自定义bridge网络
连通性相互之间需要通过-p或者–publish选项指明开放的端口,即使是两个容器连接在相同的默认bridge网络之上不需要-p与–publish选项,相互之间的端口全部开放
域名解析相互之间使用名称通信时需要指定–link选项,这种方式已过时并且不容易调试无需特别指定选项,可直接通过名称与别名通信
热插拔需要停止容器的执行并重新创建容器才能离开或者加入默认bridge网络支持随时加入与离开某个用户自定义bridge网络
灵活性系统中只能存在一个默认网络,牵一发而动全身可定义多个用户自定义网络,每个可单独配置
共享环境变量不支持通过–link选项的方式共享环境变量,更高级的共享环境变量的方式:data volume、docker-compose、docker-configs。支持通过–link选项的方式共享环境变量

备制支持 ifconfig 和 ping 命令的 ubuntu 容器。

~]# docker run --name unet -it --rm ubuntu bash root@48a255a95c37:/# apt-get update … root@48a255a95c37:/# apt-get install net-tools root@48a255a95c37:/# apt-get install iputils-ping -y
root@48a255a95c37:/#ifconfig 

在这里插入图片描述
在这里插入图片描述
启动另一个命令窗口,容器制作镜像。
在这里插入图片描述
创建自定义网络。
在这里插入图片描述
在两个窗口创建 u1,u2 容器网络,并使用以下命令 。
在这里插入图片描述
在这里插入图片描述

Docker仓库

可以使用阿里云的容器镜像服务。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
创建镜像仓库,绑定相应的代码仓库。
在这里插入图片描述
在这里插入图片描述
标签/上传
在这里插入图片描述

容器监控与日志

检查docker的状态。
在这里插入图片描述
查看容器内进程。

docker top
docker stats

容器详细信息。

docker inspect 

在这里插入图片描述
容器日志查看。
在这里插入图片描述

docker图形化管理工具

Portainer是Docker的图形化管理工具,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本能满足中小型单位对容器管理的全部需求。

docker search portainer
docker pull portainer/portainer
#单机版运行
docker run -d -p 9000:9000 \
    --restart=always \
    -v /var/run/docker.sock:/var/run/docker.sock \
    --name portainer-test \
    portainer/portainer

在这里插入图片描述
在9000端口可以访问portainer,首次登陆需要注册用户,给admin设置密码。
单机版选择local即可。
在这里插入图片描述

golang应用容器化

dockerfile
基础镜像用aline,多阶段构建。

# 构建阶段 build stage
FROM golang:stretch AS build-env
ADD . /go/src
WORKDIR /go/src
 
ENV GO111MODULE=on
ENV APP_NAME="goappname"
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -mod=vendor -o ${APP_NAME}
RUN pwd && ls -lsa
 
# 构建物打包阶段 final stage
FROM alpine:latest
 
## 配置 apk包加速镜像为阿里
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
 
## 安装 一些基础包
RUN apk update \
    && apk upgrade \
    #&& apk add s6 \
    && apk add bash \
    #&& apk add nghttp2-dev \
    && apk add ca-certificates \
    && apk add wget \
    #&& apk add curl \
    #&& apk add tcpdump \
    && apk add iputils \
    && apk add iproute2 \
    && apk add libc6-compat \
    && apk add -U tzdata \
    && rm -rf /var/cache/apk/*
 
## 设置 操作系统时区
RUN rm -rf /etc/localtime \
 && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
 
## 打包 应用
ENV APP_NAME="goappname"
ENV APP_ROOT="/data/apps/"${APP_NAME}
RUN mkdir -p $APP_ROOT
WORKDIR $APP_ROOT
 
## 从构建阶段复制构建物
COPY --from=build-env /go/src/${APP_NAME}  $APP_ROOT/
 
## 增加 配置文件、其他依赖文件
COPY config/config.toml.tpl $APP_ROOT/config/
RUN  ls -lsah && pwd && mv ./config/config.toml.tpl ./config/config.toml && ls -lsah  $APP_ROOT/config && cat config/config.toml
 
## 配置 对外端口
EXPOSE 10000
 
# 设置启动时预期的命令参数, 可以被 docker run 的参数覆盖掉.
CMD $APP_ROOT/$APP_NAME

docker-compose.yml

version: "3.1"
services:
  goappname:
    build: ./
    image: registry.cn-shanghai.aliyuncs.com/goappname/goappname
    container_name: goappname
    deploy:
      restart_policy:
        condition: on-failure
    ports:
      - "0.0.0.0:10000:10000"
    volumes:
      - "/data/apps/goappname/config/:/data/apps/goappname/goappname/config/"
Logo

更多推荐