熟悉docker的使用实验报告
准备docker环境安装在ubuntu环境下。在安装Docker Engine-Community前,先设置docker仓库,之后可以从仓库安装和更新docker。添加docker的官方GPG密钥。curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -通过搜索指纹的后八个字符,验证是否拥有...
准备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/"
更多推荐
所有评论(0)