什么是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。
1. $ docker run -d redis 2. 570315fb8a0596ff5581653a77f8ef406f86a0ab4b1a2061de7a423335812ed3
默认情况下,Docker将运行最新版本。如果需要特定版本,则需要将其显式的指定出来。
$ 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
ips:默认情况下,主机上的端口映射到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
也是可以的。
1. $ docker port redisDynamic 6379 2. 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呢?