>[info] 生产中一般都是通过dockerfile来创建容器和docker-compose来编排容器
[toc]
## 一般操作流程
# 启动docker
systemctl start docker
systemctl status docker
# 先去仓库拿到镜像
docker search ubuntu
docker pull ubuntu
docker images
# 运行镜像容器 -dit 没有d就直接进入
docker run --name myubuntu -dit ubuntu /bin/bash
# 查看启动镜像 , -a是显示所有 (默认是只显示运行的)
docker ps -a
# 启动容器
# 如果启动不了的,在运行时docker run -dit ubuntu
docker start myubuntu
# 进入容器 (别用attach进入,因为如果再开一个窗口就会同步操作,类似于单用户模式远程操作)
docker exec -i -t myubuntu /bin/bash
# 查看容器信息
docker inspect ac11f587f8c7
docker inspect ac11f587f8c7 | grep IPAddress | cut -d '"' -f 4 # 获得ip
docker inspect -f '{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' id # 获取端口映射
docker inspect -f "{{ .State.Pid }}" ac11f587f8c7 # 获得pid
# 导出容器 docker save -o [自定义镜像包名称] [镜像]
docker save -o myubuntu2.tar ubuntu
# 停止容器
docker stop container_id
# 删除容器 (删除之前要先停止)
docker rm myubuntu
# 删除镜像
docker rmi image_id # 或者image_name
# 导入镜像
docker load --input centos.tar
docker load < nginx.tar
## 运行一个web-应用
docker pull training/webapp
docker run -d -P training/webapp python app.py
# -P 将容器内部使用的网络端口映射到我使用的主机的随机端口上。返回容器id
# docker port id
# 0.0.0.0:32769->5000/tcp 5000端口映射到宿主机的32769端口上
# 也可以通过-p来指定端口,此处是将docker的5000端口映射到宿主机的8080端口
docker run -d -p 8080:5000 training/webapp python app.py
# 监听日志
docker logs -f b611241d0f01
## 其他
# 创建并拉取busybox
docker run -it --name con01 busybox:latest
# 获取环境变量
docker exec container_id env
# 杀掉所有正在运行的容器
docker kill $(docker ps -q)
# 删除老的(一周前创建)容器,注意命令必须是单引号
docker ps -a | grep 'weeks ago' | awk '{print $1}' | sed '1d' | xargs docker rm
# 删除所有的容器
docker ps -a | awk '{print $1}'| sed '1d' | xargs docker stop | xargs docker rm
# 删除已经停止的容器
docker rm `docker ps -a -q`
# 删除所有镜像,小心
docker rmi $(docker images -q)
>[info] 1. 容器不是一个虚拟机,因为他就是一个进程,如果我们退出,这个进程就退出了
>2. 如果我们执行创建容器的时候,里面没有我们指定的镜像,那么他会从dockerhub上进行下载然后在启动