docker基本概念
- docker是一种不可变基础设施,如果挂了就新建一个(基于镜像创建实体);
- docker必须有一个长期一直运行的进程,如果这个进程结束了,docker就会停止并退出,当然这个进程可以是一个命令启动多个程序;
- 弱点: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的命令一行一行往下执行。
案例如下(其中#表示注释):
# 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
其他资料
-
如果要了解详细的全链路自动化运维体系可参考:赵班长运维k8s与docker
-
linux查看当前端口占用情况:netstat -ntlp