dock 安装部署和初级管理命令

环境:
CentOS Linux release 7.6.1810 (Core)    #cat /etc/redhat-release
3.10.0-957.el7.x86_64            #uname -r

Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE。
社区版是免费提供给个人开发者和小型团体使用的,企业版会提供额外的收费服务,比如经过官方测试认证过的基础设施、容器、插件等。
社区版按照stable和edge两种方式发布,每个季度更新stable版本,如17.06,17.09;每个月份更新edge版本,如17.09,17.10。
一、docker安装

yum update        #确保yum包更新到最新
1、卸载旧版本(如有安装过旧版本)
yum remove docker docker-common docker-selinux docker-engine
#yum erase *** 卸载特定软件
2、安装需要用的软件包,并设置yum源, yum-util提供yum-config-manager功能,另两个软件是devicemapper驱动依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
3、可查看仓库所有docker版本,可选择特定版本安装
yum list docker-ce --showduplicates | sort -r
4、安装并加入开机启动,默认repo里只开启了稳定stable仓库
yum -y install docker-ce
systemctl start docker
systemctl enable docker
5、查看版本及是否成功安装
docker version

##centos6.5+安装
wget https://yum.dockerproject.org/repo/main/centos/6/Packages/docker-engine-1.7.1-1.el6.x86_64.rpm
yum -y install docker-engine-1.7.1-1.el6.x86_64.rpm

二、镜像管理命令
1、搜索镜像
docker search centos    #搜索所有的centos的镜像
2、获取镜像
docker pull centos    #获取centos镜像
3、查看本机镜像
docker images
4、删除镜像
docker rmi imageID/imagename    #删除docker镜像
#删除镜像前先删除依赖镜像的所有容器 docker rm
5、导出镜像
docker save 镜像名 >/tmp/docker_name.tar
docker image save 镜像名 >/tmp/docker_name.tar
6、导入镜像
docker load < 镜像
docker image load < 镜像
docker image ls #查看导入情况
7、给镜像打标签
docker image ls    #查看目前镜像标签
docker tag centos centos:7.7
docker image tag nginx:1.11 nginx:1.12

8、查看pull镜像的版本

docker image inspect mysql:latest |grep -i version

三、容器管理
1、启动容器
docker create -it centos /bin/bash    #创建一个容器
docker ps -a                #查看容器状态,目前容器是停止状态
docker start CONTAINER ID(容器id)    #根据创建容器的id启动
docker ps -a                #查看容器是否处于运行状态
docker attach CONTAINER ID(容器id)    #根据id进入启动的容器中
#可执行相应命令 cal/ls/ps -ef
exit    #退出容器

-i, --interactive 交互式
-t, --tty 分配一个伪终端
-d, --detach 运行容器到后台
-a, --attach list 附加到运行的容器
--dns list 设置DNS服务器
-e, --env list 设置环境变量
--env-file list 从文件读取环境变量
-p, --publish list 发布容器端口到主机
-P, --publish-all 发布容器所有EXPOSE的端口到宿主机随机端口
-h, --hostname string 设置容器主机名
--ip string 指定容器IP,只能用于自定义网络
--link list 添加连接到另一个容器
--network 连接容器到一个网络
--mount mount 挂载宿主机分区到容器
-v, --volume list 挂载宿主机目录到容器
--restart string,容器退出时重启策略,默认no [always|on-failure]
--add-host list 添加其他主机到容器中/etc/hosts
-m,--memory 容器可以使用的最大内存量
--memory-swap 允许交换到磁盘的内存量--memory-swappiness=<0-100> 容器使用SWAP分区交换的百分比(0-100,默认为-1--memory-reservation 内存软限制,Docker检测主机容器争用或内存不足时所激活的软 限制,使用此选项,值必须设置低于—memory,以使其优先
--oom-kill-disable当宿主机内存不足时,内核会杀死容器中的进程。建议设置了memory选项再禁用OOM。如果没有设置,主机可能会耗尽内存
--cpus 限制容器可以使用多少可用的CPU资源
--cpuset-cpus 限制容器可以使用特定的CPU
--cpu-shares  此值设置为大于或小于默认1024值,以增加或减少容器的权重, 并使其可以访问主机CPU周期的更大或更小比例
创建容器常用选项

docker run centos /bin/echo "Hello World"
docker run --name mydocker1 -t -i centos /bin/bash
## --name 定义容器名称, -t 分配一个伪终端绑定到容器的标准输入上
## -i 让容器的标准输入保持打开,/bin/bash 执行一个命令

创建容器时,docker后台运行的标准操作包括:
1、检查本土是否存在指定的镜像,不存在则从公有仓库下载;
2、利用镜像创建一个容器, 并启动该容器
3、分配一个文件系统给容器,并在吟诗的镜像层外面挂载一层可读写层;
4、从宿主主机的网桥接口中桥接一个虚拟接口到容器中;
5、从网桥的地址池配置一个ip地址给容器;
6、执行用户指定的应用程序;
7、执行完毕后容器被自动终止;
#启动已终止的容器 docker start

docker ps -a    #查看所有的容器
docker start CONTAINER ID(容器id)    #启动一个终止的容器
docker ps    #查看已经启动的容器

##守护进程运行(后台运行) -d参数
docker run -d centos /bin/bash -c "while true;do echo hello world;sleep 1;done"
docker ps    #查看正在运行的容器
docker logs container ID(容器id)    #获取容器输出信息

2、停止容器
docker ps -a    #查看所有的容器
docker stop container id    #停止容器
##当容器中的指定的应用终结时,容器也会自动终结,当启动一个终端容器,用户通过exit或ctrl+d退出终端,创建的容器也会立刻停止

3、进入容器

3.1、attach命令
docker attach container name/id    #通过attach进入容器
#当多个终端attach到同一容器时,所有窗口会同步显示,当其中一个终端因命令阻塞,其它窗口也无法执行操作,并且通exit退出后容器自动终止

3.2、nsenter命令 #需root权限
yum install -y util-linux
docker ps -a
docker inspect -f "{{.State.Pid}}" container id    #找到容器的第一个进程id,后面可容器id或容器名
nsenter -t 容器第一个进程id -m -u -i -n -p    #通过这个pid连接到容器
#通过nsenter进入再退出容器还保持在运行状态
#可通过脚本简化以上两条命令
cat en_docker.sh
#!/bin/bash
#user nsenter to access docker

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

./en_docker.sh docker name/id    #执行脚本加上容器id或name快速进入

3.2、exec命令
docker exec -it dockername /bin/bash
exit
docker ps

4、导出和导入容器
4.1、导出容器
docker export dockername > back.tar    #导出一个容器,也可使用docker export -o back.tar dockername
4.2、导入容器
cat back.tar |docker import - test/centos:7.6

5、删除容器
5.1、删除终止状态的容器
docker ps -a    #查看当前所有容器状态
docker rm dockerid    #删除已经停止的容器

5.2、删除一个运行中的容器,-f参数,docker发送stgkill信号给容器,再进行删除
5.3、清理所有处于终止状态的容器--->慎用
docker rm $(docker ps -a -q)    #获取全部容器的id,进行删除
  

四、docker数据管理
docker容器中管理数据有两种方式:
数据卷
数据卷容器

1、数据卷
可供一个或多个容器使用的特殊目录,它饶过ufs,提供以下特性:
a、数据卷可以在容器之间共享和重用
b、对数据卷的修改会立马生效
c、对数据卷的更新,不影响镜像
d、数据卷默认会一直存在,即使容器被删除

1.1 管理卷
docker volume create myvolume    #创建一个数据卷
docker volume inspect myvolume    #查看数据卷的信息
docker volume ls        #查看数据卷列表

1.2 用卷创建一个容器
docker run -d -it --name mycentos --mount src=myvolume,dst=/data centos    #创建一个mycentos容器,并将myvolume数据卷挂载到容器的/data目录
docker exec -it mycentos /bin/bash    #进入容器
ls /data    #查看目录为空

#在另一个终端创建文件后再查看,有文件
cd /var/lib/docker/volumes/myvolume/_data  #在另外一个终端进入到数据目录里面
echo "hello world" >> test.txt    #在数据目录创建一个文件

#再开一个终端创建一个容器,挂载同样的数据卷,实现共享和重用
docker run -d -it --name mycentos01 --mount src=myvolume,dst=/data centos
docker exec -it mycentos01 /bin/bash
ls /data/    #可发现数据是一样的

#另一种创建容器直接挂载数据卷,-v 数据卷名字:挂载路径,默认权限是rw,也可指定ro
docker run -d -it --name mycentos02 -v myvolume:/test:ro centos
#创建容器,并将数据卷挂载到容器的/test目录
docker exec -it mycentos02 /bin/bash
ls /test

1.3、删除数据卷
#需先停止使用数据卷的容器,删除容器后才能删除数据卷
#删除容器不会自动删除数据卷
docker rm mycentos mycentos01 mycentos02    #删除容器
docker volume rm myvolume    #删除数据卷

1.4、挂载一个主机目录到容器中的目录
docker run -d -ti --name web -v /webapps:/opt/webapps centos
#创建名叫web的容器,并将宿主机的/webapps目录,挂载到容器中的/opt/webapps
ls /webapps/    #查看宿主机的目录,如没有会自动创建
echo "你好" >>/webapps/index.html    #追加一个文件进去
docker exec -ti web /bin/bash    #进入容器
cat /opt/webapps/index.html    #查看容器对应目录文件的数据

1.5、挂载一个宿主机文件作为数据卷
docker run --rm -it -v ~/.bash_history:/.bash_history centos /bin/bash
#创建一个容器,并将宿主机的文件挂载到容器的相应文件
--rm #创建容器时此参数表示容器终止时自动删除


2、数据卷容器
# 如有持续更新的数据需在容器间共享,最好创建数据卷容器
# 数据卷容器就是一个正常的容器,可提供数据卷给其它容器挂载
docker run -d -v /dbdata --name dbdata centos    #创建一个数据卷容器
docker run -d -it --volumes-from dbdata --name db1 centos #创建一个db1容器,使用参数--volumes-from来挂载dbdata容器中的数据卷
docker exec -it db1 /bin/bash    #进入db1容器
ls    #查看已成功挂载dbdata数据卷
touch dbdata/filedb1    #在dbdata目录中创建一个文件
docker run -d -it --volumes-from dbdata --name db2 centos    #创建一个db2容器,继续挂载dbdata容器中的数据卷
docker exec -it db2 /bin/bash    #进入db2容器中
ls    #查看也成功挂载dbdata数据卷
ls dbdata/    #查看db1容器中创建的filedb1文件,看容器间是否数据共享了

docker run -d -ti --name db3 --volumes-from db1 centos    #创建db3,挂载db1容器的数据卷
docker exec -it db3 /bin/bash    #进入db3容器中
ls dbdata/    #查看目录,确认是否有 filedb1文件
#--volumes-from 挂载的数据卷容器自身需保持运行状态,如删除挂载数据卷容器的其它容器(db1 db2 dbdata),数据卷也不会自动删除,如要删除一个数据卷,必须在删除最后一个还挂载它的容器时使用 docker rm -v来指定同时删除关联的容器


五、docker网络管理
1、外部访问容器
1.1 -P,docker随机映射一个端口到内容容器开放的网络端口
docker run -d -P --name mynginx nginx:1.12    #创建一个容器,通过-P随机映射宿主机的端口到容器的网络端口
docker ps    #查看容器信息,有相应宿主机端口到容器端口的映射
curl localhost:port    #测试是否访问到容器
docker logs -f mynginx    #查看应用日志

1.2、-p指定要映射的端口,在一个指定端口上只能绑定一个容器
ip:hostport:containerport
docker run -d -p 8080:80 --name mynginx01 nginx:1.12
docker ps
docker run -d -p 127.0.0.1:18081:80 --name mynginx02 nginx:1.12
docker ps
docker run -d -p 127.0.0.1::80 --name mynginx03 nginx:1.12    #本地任意端口到容器80,宿主机自动分配一个端口
docker ps
docker run -d -p 127.0.0.1:8081:80/udp --name mynginx04 nginx:1.12    #映射8081到容器80,并指定udp

1.3 查看映射端口配置
docker port mynginx01
docker inspect #可获到容器内部网络地址所有变量
docker run -d --name mynginx05 -p 8082:80 -p 8083:443 nginx:1.12 #多次使用-p,同时绑定多个端口
docker ps

2、容器互联
2.1 --link参数让容器之间安全进行交互
docker run -e MYSQL_ROOT_PASSWORD=123456 -d --name mydb mysql    #创建一个新数据库容器
docker run -d -P --name myweb --link mydb:db nginx:1.12    #创建一个web容器,并连接到mydb数据库容器
docker ps
##避免暴露数据库端口到外部网络上

docker run --rm --name myweb1 --link mydb:db nginx:1.12 env    #创建web容器,连接到mydb,查看web容器的环境变量
docker run --rm -ti --name myweb2 --link mydb:db nginx:1.12 /bin/bash    #创建web容器,同样连接mydb
cat /etc/hosts
#host信息被添加到父容器的/etc/hosts文件


原文地址:https://www.cnblogs.com/xiefugui/p/12118633.html