总结一下最近几个月使用docker的基本知识和常用命令

182 阅读4分钟

docker基本概念

  1. docker是一种不可变基础设施,如果挂了就新建一个(基于镜像创建实体);
  2. docker必须有一个长期一直运行的进程,如果这个进程结束了,docker就会停止并退出,当然这个进程可以是一个命令启动多个程序;
  3. 弱点:docker只能在前台运行进程,网络通讯方面非常弱。

docker能干啥?

  • 面向产品:  产品交付,快速部署;不会强依赖硬件也可以降低成本;

  • 面向开发:  简化环境配置,提高开发效率,自动化打包测试到部署等;

  • 面向测试:  多版本测试,多人员测试,串行改并行不用排队;

  • 面向运维:  环境一致性

  • 面向架构:  隔离应用,自动化扩容当容量不足就多起几个docker,类似于微服务SOA

使用

用某个docker镜像起了一个容器就不可以删除这个镜像了

常用命令

下面以名称为nginx的docker作为案例

查看本机所有docker运行信息

docker ps -a
过滤查询容器名为nginx的docker
docker ps -a | grep nginx
可以看到当前所有容器的运行状态和基本信息,Status为Exited表示退出了

此处镜像名称这么长是为了方便将该镜像推送到92.168.78.108:5000的docker仓库,如果是本地运行没有仓库的话就可以随意命名

镜像相关操作

#由Dockerfile创建镜像(192.168.78.108:5000/messageroute为镜像名称,v2.1为镜像版本,最后的.不可以缺少,它表示当前路径)
docker build -t 192.168.78.108:5000/messageroute:v2.1 . 

#搜索镜像:
docker  search  xxx

#从仓库拉取镜像: 
docker  pull  xxx

#查看docker镜像
docker images

#删除docker镜像
docker rmi  [镜像id]
docker rmi xxx:v1.0

#将指定镜像保存成 tar 归档文件
docker save -o  xxx.tar xxx:v10   , 如:
docker save -o my_ubuntu_v3.tar runoob/ubuntu:v3

使用镜像启动运行容器

docker run -p port:port  --name xxxxx -d imageid 
xxxx为app名称,Port 为app所用端口号,imageid 为上图所标的镜像id

#以宿主机器托管模式启动docker容器(将会将宿主机的ip作为docker的ip启动,--restart=always 表示开机自动启动)
docker run -d --network=host --name xxx  xxx:vx.x

docker run --network host -d --name nginx --restart=always -v /opt/nginx/:/etc/nginx/conf.d/ nginx:latest

docker run --network host -d --name iotinfoapp2.0 --restart=always -d xxx[imageid]xxx

#重启docker
docker restart nginx

进入docker(还有其他方法,但是这个比较常用)

docker exec -it nginx /bin/bash
如果没有bash,只有sh,则为 docker exec -it nginx sh

不进入容器但是要docker执行一个命令

docker esec  xxx  [要执行的命令]

复制当前文件夹的default.conf 到nginx所在docker的conf.d目录下

docker cp default.conf nginx:/etc/nginx/conf.d/

查看docker日志

#查看docker运行日志
docker logs --tail 30 nginx
#查看docker实时日志
docker logs --tail 50 -tf iotmanageappv2

退出容器内命令行

# 在容器内执行exit即可
exit

停止、删除容器

#停止正在运行的docker容器
docker stop xxx
#删除docker容器
docker rm xxx
#强行删除正在运行的容器(-f标记force)
docker  rm -f  xxx

docker 仓库相关

#推送到 docker 仓库
docker push 192.168.78.108:5000/messageroute:V2.1

#将当前docker存储为镜像并提交到仓库
docker commit xxx[docker name]  xxx[镜像名]:vx.x[镜像版本]
例如:
docker commit messageroute 192.168.78.108:5000/messageroute:V2.0.0

使用docker-compose.yml启动容器

docker-compose up -d

进入容器的其他方法

  • docker attach 
  • nsenter(推荐)但是该命令要依赖一个yum库util-linux【执行yum install -y util-linux安装】 编写快速进入docker的sh脚本,docker_in.sh这个脚本是在宿主机上的,在宿主机执行之后进入对应的docker
#!/bin/bash

docker_in(){
  NAME_ID=$1
  PID=$(docker inspect -f "{{ .State.Pid }}" $NAME_ID)
  nsenter -t $PID -m -u -i -n -p
}
docker_in $1

执行脚本:./docker_in.sh  xxx      (xxxw为要进入的docker容器名称或者id) 即可进入容器

Dockerfile格式

Dockerfile,D必须大写 主要总结:

Dockerfile

启动的时候会按照Dockerfile的命令一行一行往下执行。

案例如下(其中#表示注释):

# This docker file uses the centos image
# VERSION 1
# Author: Fane Zhang
 
# Base image
FROM centos
 
# Maintainer
MAINTAINER shundong.zhao zhaoshundong@gmail.com
 
#Commands to copy files
ADD pcre-8.37.tar.gz /usr/local/src/
ADD nginx-1.9.3.tar.gz /usr/local/src/
 
RUN yum install -y wget gcc gcc-c++ openssl-devel make
RUN useradd -s /sbin/nologin -M www
WORKDIR /usr/local/src/nginx-1.9.3
RUN ./configure --prefix=/usr/local/nginx --user=www --group=www \
     --with-http_ssl_module --with-http_stub_status_module --with-file-aio \
     --with-http_dav_module --with-pcre=/usr/local/src/pcre-8.37 && make && make install
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
ENV PATH /usr/local/nginx/sbin:$PATH
 
EXPOSE 80
CMD ["nginx"]

  案例二:构建一个node的docker容器

FROM 192.168.78.108:5000/node:v12.18
MAINTAINER ZHANGH

# APP创建文件夹
RUN mkdir -p /app
# 指定工作目录
WORKDIR /app
# .表示拷贝当前文件夹下所有内容到 镜像内的/app文件夹下
COPY . /app

EXPOSE 3333

CMD [ "node", "nodeServer/main" ]

执行完毕之后启动运行:

docker run -p port:port  --name xxxxx -d imageid ,

xxxx为app名称,Port 为app所用端口号,imageid 为上图所标的镜像id

其他资料

  1. 如果要了解详细的全链路自动化运维体系可参考:赵班长运维k8s与docker

  2. linux查看当前端口占用情况:netstat  -ntlp