您的位置:首页 > 运维架构 > Docker

Docker常用命令总结

2018-03-14 00:00 489 查看
本txt就工作中用到的常用命令做一个梳理,仅供参考。

docker的使用可暂时分为2部分的内容:基本使用、集群部署
把镜像仓库类比为git,相关命令很相似。

一、基本使用
1. 从仓库拉取基础镜像
镜像仓库分为公有和私有。不论是准一还是生产环境,咱们都有各自的私有仓库,即可以从私有、公有仓库拉取镜像,根据个人需求选择镜像。
1.1 从公有仓库拉镜像:
1.1.1 根据关键字搜索镜像
docker search XXX
1.1.2 从仓库拉取镜像到本机
docker pull image-name:tag
1.2 从私有仓库拉取镜像。以生产环境为例
docker pull 10.*.*.*:5000/image-name:tag
1.3 查看本地镜像
docker images

2. 制作镜像image
镜像的制作都是基于Dockerfile文件的,Dockerfile实际上就是一个描述性文件,用来描述目标image的。好的Dockerfile应该记录目标image所具备的所有内容,原则上应该是尽可能把所有内容都写到Dockerfile里。如果不能做到一次性写到位Dockerfile,也不必担心,后期可以在容器里修改了再commit到镜像上。

2.1 下面简要说一下Dockerfile
# 表明目标image所基于的基础镜像,必要
FROM image-name:tag

# 创建者的基本信息,非必要
MAINTAINER lichunyan (vamlichunyan@foxmail.com)

#容器要暴露的端口号,根据需求选择是否暴露
EXPOSE 8001

# 设置环境变量,比如 ORACLE_HOME 、 JAVA_HOME 、自定义环境变量都可以在此设置。多个环境变量用空格分隔。
ENV A=a B=b C=c

#设置容器的本地时区为上海时区,必需。
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# 在容器里建目录,根据需要选择
RUN mkdir -p /app && mkdir -p /opt/logs

# 把当前./go_apps/dockrMain 拷贝到容器的/目录下。 工作中我主要用来把目标容器要跑的项目代码拷贝到容器指定位置
ADD ./go_apps/dockrMain /

#指定容器里的工作路径,配合下面的CMD使用,CMD所执行的命令,是在在这个工作路径上执行的,非必需。默认是容器根目录/
WORKDIR /app

#容器入口命令,要求该命令是一个阻塞型命令。必要。 原则上,该入口命令是目标容器要运行的服务的启动命令。 以下命令等价于 python XX.py
CMD ["python","XX.py"]

上述参数基本够平时工作使用了,更多参数请查阅官方文档。

2.2 根据Dockerfile制作目标镜像
# -t 用来指定镜像名称的, 后面的 . 不可遗忘,表示使用当前目录下的Dockerfile build镜像,也就意味着你必须在Dockerfile的目录下执行这个命令
docker build -t image-name:tag .
该命令正确执行后会返回一行类似ID的东东,我没搞明白那是啥,貌似不是镜像ID,貌似这个不重要。
然后可以使用docker images 查看你刚刚build成功的镜像。

3. 容器container启动
在2中我们已经成功build了镜像,接下来就是要使用这个镜像把目标容器跑起来。
容器的启动有很多种方式,我讲一下我工作中用到的3种方式。
3.1 使用docker命令启动;
这种方式最原始,但是也是最能明白容器的启动参数原理的,我会在一些非正式的场合使用这种方式快速启动类似私人测试的容器。
docker run -d -p 8001:9001 --name container-name image-name:tag #-d 表示在后台运行容器,-p 8001:9001 表示把宿主机器的8001端口映射到容器的9001端口
更多docker run 的参数请查看官方文档

3.2 使用docker-compose命令启动;
这种方式需要docker-compose.yml文件,该文件可以理解为把docker run命令的一些参数文档化,这样下次启动的时候直接使用这个文件就好,不必每次启动都要手动去硬敲一长串的命令。下面简单讲一下该文件

version: '2' #文档版本号,貌似必须是2,不然会出错,具体原因我没深究
services:
service1: # 服务名,多个服务只需要增加相应数量节点即可
image: image-name:tag # 也可类似 image: 10.*.*.*:5000/prod-image-zhifu-asyncquerygo:v3 意味着从10.*.*.*:5000拉取镜像prod-image-zhifu-asyncquerygo:v3
restart: always # 始终自动重启
ports:
- 9005:9006 # 宿主机器的9005端口映射到容器的9006端口,可设置多个端口影射
container_name: rc-lichunyan-go #容器名称,自定义
volumes: #目录挂载
- /opt/logs/rc-lichunyan/go_apps_logs:/opt/logs #将宿主机的/opt/logs/rc-lichunyan/go_apps_logs和容器的/opt/logs做影射,即在宿主机的/opt/logs/rc-lichunyan/go_apps_logs目录下看到的是容器的/opt/logs目录下的内容
environment: #环境变量,类似Dockerfile里的ENV
- LOG_PREFIX=/opt/logs

service2:
...
有了docker-compose.yml咱们就可以使用docker-compose命令启动容器了:
docker-compose up -d # -d 依然表示在后台运行
可以看到,咱们只用了简单的 docker-compose up -d 这句命令就把容器启动起来了,相比于docker run 方式,不仅不需要手工写冗长的参数,而且还可以一次性启动多个容器,this is fantastic !save us a lot !

3.3 使用docker stack deploy 启动
这种方式就是第二部分集群部署要讲的内容

4. 进入容器
容器启动上来后,你可能想进入到容器里作一些操作,使用下面这条命令就可以进入到容器里
docker exec -it container-name /bin/bash
使用exit即可从容器退出到宿主机。

5. 容器container提交
这部分非必需,但多数时候却是必需的。如果你在容器内部做了修改,如果希望下次再启动容器的时候,本次做的修改依然有效的话,就必需commit,否则,万一哪天机器宕机,你的容器被迫停止,刚好你没commit,那估计你就要哭了~
docker commit container-name image-name:tag # 容器、镜像名可以用相应的ID替代,commit 到已有镜像时,已有镜像将会被覆盖。

6. 提交镜像到仓库
6.1 先tag
docker tag rc-image-rediscluster:v2 10.*.*.*:5000/rc-image-rediscluster:v2
6.2 再push
docker push 10.*.*.*:5000/rc-image-rediscluster:v2

7. 其它相关命令
docker ps # 查看当前正在运行的容器
docker ps -a # 查看所有的容器,包括启动失败、停止的容器
docker rm container-name #删除容器,ontainer-name可以使用ontainer-id代替
docker rmi image-name # 删除镜像,image-name可以用image-id代替。 删镜像成功的前提是,用它启动的所有容器都已删除,否则将会失败。

二、集群部署
生产环境,按照领导要求,所有服务都需要docker集群化部署的,方便管理。相比于docker-compose可以管理当前宿主机上所有的服务,docker swarm可以统一管理多台负载机器上的所有服务,比docker-compose更强大。

1. docker swarm init
docker swarm init --advertise-addr 10.*.*.1:2377
初始化docker swarm,命令正确执行后的内容类型下面内容:
[was@dqapp112132 docker-compose]$ docker swarm init
Swarm initialized: current node (fbhzdzt24c9uih5fqchvwpv14) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-0fviu393dhjftunv8vz6qsctcn34i2tg3mbii5bg8xms2d9y8u-03k73ziio3l8s913nbv0wt02g 10.*.*.1:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

请将里面的 docker swarm join --token SWMTKN-1-0fviu393dhjftunv8vz6qsctcn34i2tg3mbii5bg8xms2d9y8u-03k73ziio3l8s913nbv0wt02g 10.*.*.1:2377 备份好。请将示例里的IP替换成你宿主机器的IP,端口号不变。
执行完该命令,当前宿主机扮演docker swarm 的manager角色了,它负责统一管理所有node上的容器。

2. docker swarm join
node如果要加入到docker swarm集群里,就需要在node机器上使用join命令,比如你可以10.*.*.2机器上使用示例:
docker swarm join --token SWMTKN-1-0fviu393dhjftunv8vz6qsctcn34i2tg3mbii5bg8xms2d9y8u-03k73ziio3l8s913nbv0wt02g 10.*.*.2:2377
那么此时10.*.*.1和10.*.*.2台机器就在同一个docker swarm下了,其中10.*.*.1是manager,10.*.*.2是node,这意味着,所有管理只需要在manager机器10.*.*.1上执行即可,而node机器10.*.*.2上不需要作任何操作。
示例命令中的token即为步骤1中嘱咐你备份的内容。
更多node均采用该方法join。

3. docker node ls
该命令在manager机器上执行,用来查看这个manager的node信息

4.docker stack deploy -c docker-compose.yml zhifu
该命令用来发布、启动所有节点上的容器,需要用到docker-compose.yml文件,在该文件里,你配置你的所有服务,可以参考7中示例理解。最后一个参数zhifu自定义,指定你服务的名称,并且最好记住,因为你需要这个参数去rm、ps操作。
增加/减少 node/实例 ,更改配置等操作后,都只需要重新执行一下该命令即可生效,属于热部署,不会影响到正在运行的容器,除非你减少node、实例。

5. docker stack ps
该命令跟docker ps具有相同的功能,只不过docker stack ps是用来查看docker swarm下的容器信息
示例: docker stack ps zhifu # 查看zhifu相关的容器信息

6. docker stack rm
该命令用来停止响应的swarm服务,
示例:docker stack rm zhifu # 该命令执行后,zhifu的集群就会停止,你使用docker stack ps zhifu 将不会看到任何容器,并且docker ps也不会看到响应的容器信息

7. docker-compose.yml 示例
version: '3' #必需是3
services:
prod_zhifu_asyncquerygo: # 服务名
image: 10.*.*.*:5000/prod-image-zhifu-asyncquerygo:v3 #镜像名,此处直接从仓库拉镜像
restart: always #自动重启
deploy:
replicas: 2 #实例数量
resources:
limits: #限制配置
cpus: "0.3" #cpu使用率不能超过0.3
memory: 5000M #内存使用率不能超过5000M
restart_policy: #重启规则
condition: on-failure # 重启条件:失败
ports:
- 8001:8001 #将宿主机8001 端口映射到容器8001端口
container_name: prod-zhifu-asyncquerygo # 容器名称,swarm里这个参数没啥用,因为swarm根本不用这个,而是采用 docker stack deploy -c docker-compose.yml zhifu 命令里的zhifu按照一定的规则给容器命名的
volumes:
- /app/logs/prod-vivian/go_apps_logs:/opt/logs
environment:
- LOG_PREFIX=/opt/logs
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Docker Swarm