Docker之镜像创建及部署

2019-02-20 23:33:56

上篇文章提到了一些简单的docker命令,这里主要展示一下我们如何将我们需要的服务利用docker一步一步把它跑起来,文章内容不够全面,仅供学习参考使用。
穿梭门:Docker之常用命令

尝鲜

我们可以从最简单的Hello World开始,感受一下Docker的运行效果,直接在命令行执行下面的命令,就能从官方仓库中拉取指定名字的镜像。如果拉取的是自己或其他渠道提供的镜像,pull后面带指定路径即可。

docker pull hello-world

拉取成功后执行docker images可以看到拉下来的镜像列表,然后我们直接跑起来

docker run hello-world

docker_run
输出这段提示后,hello world就会停止运行,容器自动终止。有些容器不会自动终止,因为提供的是服务,比如我们常部署的服务等。

注:
docker run命令具有自动抓取image文件的功能,如果发现本地没有指定的image,就会从仓库中自动抓取,也就是前面的docker pull并不是必须的。

正餐

上面的hello-world明显不能满足我们的欲望,我们的实际需求是将我们自己原本跑在VM或物理机上的服务能部署在Docker上面,那我们现在就开始吧。

Dockerfile

要达到我们的目的,不能离开的就是这个Dockerfile文件,Docker是根据该文件来生成二进制的image文件。我们直接使用一个实际的样例来进行讲解,新建一个文件并命名Dockerfile

FROM centos

RUN  curl -O 'https://dl.google.com/go/go1.11.5.linux-amd64.tar.gz' && \
        tar -C /usr/local -zxvf go1.11.5.linux-amd64.tar.gz && \
        echo 'export PATH=$PATH:/usr/local/go/bin' >> /etc/profile && \
        source /etc/profile

上面文件的内容写的很简单,主要实现的功能就是在centos环境搭建一个golang环境,当然其中省掉了GOPATH的配置,需要的话可以直接参照上面的步骤。

注:
FROM是指从需要的镜像源,可以是本地的,也可以是远端的,他的优先级是:本地获取->远端
RUN是指执行命令

编译

在Dockerfile文件所在路径下进行我们的docker构建,构建命令如下:

docker build -t centos-go:1.11.5 .

其中-t是指定镜像名称centos-go1.11.5是打的tag,详细参考docker build --help。命令最后的点.表示Dockerfile的路径。使用

docker images

就能看到我们刚编译好的本地镜像了
docker_images

运行

一个最基本的镜像就这么编译好了,我们把它跑起来并进入容器内部

$ sudo docker run -it centos-go:1.11.5 bash
[root@c2713b0babbe /]# cat /etc/profile
# /etc/profile

# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc

# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.

...

unset i
unset -f pathmunge
export PATH=$PATH:/usr/local/go/bin

此时你已经发现运行的镜像中已经将我们配置的golang配置加载进去了。运行到这里,其实我们完成了重要的一步了,很多服务的运行基础环境就是这么来的,打一个基础镜像版本,然后将基础镜像推送到自己的镜像仓库中,比如腾讯云或阿里云仓库,下次构建项目服务的时候就基于此基础版本来进行编译。

Dockerfile语法

See More:官方文档

FROM node:8.4
COPY . /app
WORKDIR /app
RUN npm install --registry=https://registry.npm.taobao.org
EXPOSE 3000

注:
FROM node:8.4:该 image 文件继承官方的 node image,冒号表示标签,这里标签是8.4,即8.4版本的 node
COPY . /app:将当前目录下的所有文件(除了.dockerignore排除的路径),都拷贝进入 image 文件的/app目录
WORKDIR /app:指定接下来的工作路径为/app
RUN npm install:在/app目录下,运行npm install命令安装依赖。注意,安装后所有的依赖,都将打包进入 image 文件
EXPOSE 3000:将容器 3000 端口暴露出来, 允许外部连接这个端口
其它命令如下
dockerfile_cmd

其它

常用运行命令

运行

docker run -d -p 8888:80 nginx

运行nginx服务,并将本机端口8888与nginx的80端口进行绑定。

查看日志

docker logs --help

里面可以列表很多命令,如指定时间返回内的日志等,大家各自执行以下,各取所需。

进入终端

docker exec -it cfc49596eedf /bin/bash

注:
更多有效命令可以多多执行--help,里面看一下就能解惑了

Docker之常用命令

简介 Docker的命令很多,但根据二八原则,会使用常用的那两层命令足以应付八层场景。 命令 更多命令建议使用docker --help的方式查看,针对某一个具体的command也可以使用docker [CMD] --help的方式查看,命令用法比较详细。 镜像搜索 使用docker search进行镜像资源搜索,搜索来源于镜像仓库,默认是Docker Hub中,国内腾讯云或阿里云均有镜像加速器 docker search [name] 注: NAME:镜像仓库名称。 DESCRIPTION:镜像仓库描述 STARS:镜像仓库收藏数,表示该镜像仓库的受欢迎程度,类似于 GitHub的 star OFFICAL:表示是否为官方仓库,该列标记为[0K]的镜像均由各软件的官方项目组创建和维护 AUTOMATED:表示是否是自动构建的镜像仓库 拉取镜像 从docker仓库中获取指定镜像 docker pull name:[tag] 注: 从仓库中拉取指定的镜像,后面tag为指定镜像版本,也可以不指定,默认为latest

Go zk(zookeeper)服务发现

简介 zk同etcd一样,存储数据格式均采用key-value类型,而我们在进行微服务开发时,这两者大部分的应用场景都是应用在服务发现以及服务配置上。 流程 基于zk的服务注册与发现大致流程如下: 如:A、B两个服务均在内网环境,A需要向B发起接口调用,A需要从本地的缓存中获取出B对应的调用ip:port信息,然后向B发起调用。A中的缓存是A服务在启动时就开启了一个协成或线程用于从zk中拉取或监听服务数据,而zk的服务数据是通过B在启动时开启了一个TCP长连接向zk进行的服务注册。 实现 整个流程相对简单,以下为服务发现的监听测源码,该源码依赖 github.com/samuel/go-zookeeper package main import ( "fmt" "time" "github.com/samuel/go-zookeeper/zk" ) var ( path = "/entry/test" ) func main() { c, _, err