2124291addddf4a96bdebc6613d1013c.png

原创首发于公众号:编程三分钟

换电脑的时候不想再搭建开发环境了!——编程三分钟

什么是docker

Docker是一个用来管理容器的应用程序,而容器就是模拟运行应用程序所依赖环境的一个服务。一般一个容器内只安装一个程序,在容器内的应用程序会认为自己是机器上运行的唯一进程,一台机器可以独立运行多个容器。

使用容器的好处就是不用再繁琐的配置运行环境,便于构建、测试、持续集成;可以动态扩容和缩容、充分利用一台服务器跑多个服务,因此在本机就可以模拟出微服务架构。

当然,我个人觉得最爽的一点还是可以在容器里随意的开发测试,但也不用担心把自己心爱的电脑搞的乱七八糟了。

准备

  • 一台安装docker的机器
  • 能通网并访问最新版本的Docker Engine (服务端)
  • 本地开发机器安装了Docker Client(Docker 命令行工具),可通过命令行访问。

运行容器

可以在 官网上 搜索到现成的镜像,也可以用以下方式查找容器,命令格式:

docker search <name>

实际执行

$ docker search redis
NAME               DESCRIPTION                                             STARS OFFICIAL AUTOMATED
redis              Redis is an open source key-value store that… 7023            [OK]
bitnami/redis      Bitnami Redis Docker Image 114                                          [OK]   
省略……

我们找到了redis的OFFICIAL(官方)docker 镜像名就是redis,为了让它能提供服务,我们接下来的任务就是让他作为后台服务运行,命令格式:

$ docker run <options> <image-name>

默认情况下,Docker将在前台运行命令。要在后台运行,需要指定选项-d。

$ docker run -d redis
570315fb8a0596ff5581653a77f8ef406f86a0ab4b1a2061de7a423335812ed3

默认情况下,Docker将运行最新版本。如果需要特定版本,则需要将其显式的指定出来。
例如,版本3.2

$ docker run -d redis:3.2

由于这是我们第一次使用Redis镜像,所以它将被下载到Docker主机上,如果本地存在就不会了。

查看运行中的容器

可以用docker ps命令列出所有正在运行的容器,包括用于启动容器的镜像和正常运行的时间等信息。

$ docker ps
CONTAINER ID IMAGE   COMMAND                 CREATED       STATUS PORTS NAMES
570315fb8a05 redis   "docker-entrypoint.s…" 5 minutes ago Up 5 minutes 6379/tcp elastic_mclean

列出正在运行的容器的更多详细信息,例如IP地址,命令格式如下:

docker inspect <friendly-name|container-id>

通过docker logs命令可以查看容器的日志,命令格式如下:

docker logs <friendly-name|container-id>

访问redis

我们现在用容器部署成功了一个redis,但是和直接安装一个redis不一样,容器就像一台虚拟机一样,想要访问服务,要不就进入到里面,要不就通过暴露端口像远程访问一样来进行访问。

-p <host-port>:<container-port>选项可以在启动容器的时候绑定端口。

这个时候使用-name <name>来在启动容器的时候定义一个名称,以后查询以及查看日志都会比较方便。

因为redis默认占用6379端口,我们可以将端口6379映射到本地的6379

$ docker run -d  --name redisHostPort -p 6379:6379 redis:latest
694384d739307f3c5bc59fa

tips:默认情况下,主机上的端口映射到0.0.0.0,可以在定义端口映射的时候指定特定的IP,例如-p 127.0.0.1:6379:6379

假设我们要部署多个redis不可能每次都自己亲手来找一个端口来映射,docker是支持自动绑定到可用端口上的,只要用-p 6379这个参数就可以了,像下面这样。

$ docker run -d --name redisDynamic -p 6379 redis:latest
dcd3dabe51c3f0a8ddbdfd

到底绑定了哪个端口,可以用以下命令查询(这个时候就用到自定义的名称redisDynamic了),当然直接用docker ps也是可以的。

$ docker port redisDynamic 6379
0.0.0.0:32768

存储数据

在使用容器的时候我们会发现,一旦创建和删除、升级容器,里面存储的数据也就随风而去了,所以我们必须想办法把数据存储下来。

我们查询到官网上的redis镜像存储数据的目录在/data目录,然后我们存储在本地/opt/docker/data/redis
使用参数-v 本机位置:容器内位置

docker run -d --name redisMapped -v /opt/docker/data/redis:/data redis
c9c154695500260407d99d

当然了,也可以把配置文件重定向到本地,可以把所有的容器配置、日志、数据统一管理,非常的方便。

与平台交互

docker run ubuntu ps 启动Ubuntu容器并执行命令ps以查看容器中运行的所有进程。docker run -it ubuntu bash直接访问容器内的bash shell。

$ docker run ubuntu ps
  PID TTY TIME CMD
    1 ?  00:00:00 ps
$ docker run -it ubuntu bash
root@6db973337059:/# exit

访问正在运行的dockerdocker attach <container> 要attach上去的容器必须正在运行。docker exec -it <container> bash|sh直接访问容器内的bash shell。

$ docker attach c9c154695500 /bin/bash
root@c9c154695500:/data# exit
$ docker exec -it c9c154695500 /bin/bash
root@c9c154695500:/data# exit

这里也可以直接用容器name

  • attach 直接进入容器,不会启动新进程
  • exec 在容器中打开新终端,会启动新进程

那什么时候用attach,什么时候用exec呢?

推荐阅读

(点击标题可跳转阅读)

10 个方便的Bash别名

如何向朋友解释什么是云计算?

MySQL:硬盘在24 * 7工作中罢工了,我该怎么办?

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐