docker学习笔记-1.docker基础
docker基本
docker 官方网址 https://www.docker.com
docker 目前支持多种操作系统的安装,在linux系统中要求内核的版本在3.10或以上版本。
2017年 docker推出新的项目Moby,github地址为:https://github.com/moby/moby ,Moby属于Docker项目的全新上游项目,Docker将是一个隶属于Moby的子产品,之后的版本将分为CE(社区版)和EE(企业版)
docker从2017.3.1开始每个季度发布一个稳定版本,其版本规则变更为YY.MM
CE版本 维护四个月,EE版本维护一年
本次docker的实验都是基于centos7.5。
本次学习的docker版本为1803
阿里云的rpm下载地址
https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/
官方rpm包的下载地址
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
docker安装和操作
下载安装docker
启动并验证docker服务
查看docker的版本
docker version
验证docker网卡
在docker启动后,默认生成一个名为docker0的网卡,并默认IP地址为172.17.0.1
查看docker信息
docker info
docker存储引擎
目前docker的默认存储引擎为overlay2,需要磁盘分区支持d-type文件分层功能,因此需要系统磁盘额外的支持。
如果docker的数据目录为一块单独的磁盘分区,并且是xfs格式,那么需要在格式化磁盘时候,加上参数 -n ftype=1,否则后期启动容器的时候会报不支持d-type.
docker镜像加速配置
国内下载国外镜像有时候会很慢,因此有时候可以更改docker配置文件添加一个加速器,可以通过加速器达到加速下载目的。
https://cr.console.aliyun.com/
创建目录
[root@localhost docker]# mkdir /etc/docker/
创建文件并修改
[root@localhost docker]# vi daemon.json
[root@localhost docker]# cat daemon.json
{"registry-mirrors":["https://7mbt1t62.mirror.aliyuncs.com"]}
[root@localhost docker]#
重启docker服务
[root@localhost docker]# systemctl daemon-reload
[root@localhost docker]# systemctl restart docker
docker镜像基础命令
不指定版本&指定版本
[root@localhost docker]# docker search centos
[root@localhost docker]# docker search centos:7.5
从docker仓库将镜像下载到本地
[root@localhost docker]# docker pull centos
查看本地镜像
下载完成的镜像比下载的大,因为下载完成后会解压。
#Repository 镜像所属的名称
#TAG 镜像版本号 默认为latest
#IMAGE ID 镜像唯一ID表示
#CREATED 镜像创建时间
#SIZE 镜像的大小
镜像导出
可以将镜像导出到本地为一个压缩文件,然后复制到其他服务器进行导入使用。
镜像导出方法1
[root@localhost data]# docker save centos >/root/data/centos-1.tar.gz
镜像导出方法2
[root@localhost data]# docker save -o /root/data/centos-2.tar.gz centos
查看镜像的内容
包含了镜像的相关配置,配置文件分层,分层是为了方便文件使用,即相同的文件可以共用。
镜像导入
两种方法进行导入
docker load </root/data/centos-1.tar.gz
docker load -i /root.data/centos-2.tar.gz
删除镜像
当有容器使用该镜像启动运行时,该镜像不能删除。
docker rmi centos
获取运行参数帮助
docker daemon -help
删除容器
删除没有在运行的镜像
docker rm 容器ID|容器名称
强制删除正在运行的镜像
docker rm -rf 容器ID|容器名称
docker的基础操作命令
单次运行,没有自定义容器名称。启动的容器在执行完shell命令后就退出
[root@localhost data]# docker run centos echo 'hello world.'
查看正在运行的容器
[root@localhost data]# docker ps
查看所有的容器,包括退出的容器。
[root@localhost data]# docker ps -a
从镜像启动一个容器,并随机生成容器ID和名称
退出容器 ctrl+p+q
随机映射端口
[root@localhost ~]# docker pull nginx
在前台启动容器,退出后容器也会退出,-P 随机映射端口
[root@localhost ~]# docker run -P nginx
从另一个终端查看容器宿主机的端口的映射,默认是从32768开始的
指定端口映射&指定启动容器的名字 --name -p 指定端口映射
[root@localhost data]# docker run -p 8888:80 --name nginx-1 nginx
可以一次性映射多个端口
[root@localhost ~]# docker run -p 8888:80 -p 8889:443 --name nginx-2 nginx
可以指定协议,默认协议为tcp -d 表示 在容器宿主机的后台执行
[root@localhost ~]# docker run -d -p 8883:80/udp --name nginx-4 nginx
查看容器的访问日志
[root@localhost ~]# docker logs nginx-1 # 一次查看
[root@localhost ~]# docker logs -f nginx-13 #持续查看
查看容器已经映射的端口
[root@localhost ~]# docker port nginx-1
自定义容器名称 并在前台执行
[root@localhost ~]# docker run -it --name nginx-test nginx
自定义容器名称 并在后台执行
[root@localhost ~]# docker run -d -p 8888:80 --name nginx-test nginx
创建容器,并进入容器
[root@localhost ~]# docker run -it --name centos-test centos /bin/bash
创建容器,在前台执行,退出容器后,容器自动删除
[root@localhost ~]# docker run -it -rm --name nginx-test nginx
容器的传递命令,容器需要一个前台运行的进程才能保持容器的运行,通过传递运行参数是一种方式,另外一种方式在构建镜像的时候指定容器启动时的运行的前台命令。
[root@localhost ~]# docker run -d --name centos-test centos /usr/bin/tail -f '/etc/hosts'
容器的启动和关闭
[root@localhost ~]# docker start cb3745225159
[root@localhost ~]# docker stop cb3745225159
进入正在使用的容器
方法1
此方法进入容器后会同步给所以进入容器的用户;exit退出容器后,容器关闭。不推荐使用
[root@localhost ~]# docker attach cf41e382bba6 # 后面跟容器id或者容器名称
方法2
使用nsenter命令
推荐使用此方法,nsenter命令需要通过PID进入容器内部,可以使用docker inspect 获取容器的PID
[root@localhost ~]# yum install util-linux #安装nesenter命令
[root@localhost ~]# docker inspect -f "{{.State.Pid}}" cf41e382bba6 #后面跟容器的ID
获取到某个docker容器的PID,可以通过PID通道进入到容器中
安装nsenter 命令
util-linux包中含有nsenter命令,下载 util-linux的源码包 https://mirrors.edge.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24-rc2.tar.gz
./configure --without-ncurses --prefix=/opt/util/
make && make install
执行命令 进入容器
[root@192 tool]# docker ps -a
[root@192 tool]# docker inspect -f "{{.State.Pid}}" cf41e382bba6
[root@192 ~]# nsenter -t 3916 -m -u -i -n -p
使用docker-in.sh进入容器
1 #!/bin/bash 2 docker_in(){ 3 NAME_ID=$1 4 PID=$(docker inspect -f "{{.State.Pid}}" ${NAME_ID}) 5 nsenter -t ${PID} -m -u -i -n -p 6 } 7 docker_in $1
查看容器的 hosts文件
[root@192 ~]# docker run -it --name sakula centos /bin/bash
[root@254bdef59ba0 /]# cat /etc/hosts
172.17.0.4 254bdef59ba0 # 默认会将实例ID添加到hosts文件中
批量关闭正在运行的容器
[root@192 ~]# docker stop `docker ps -q`
批量强制关闭正在运行的容器
[root@192 ~]# docker kill $(docker ps -a -q)
批量删除已将退出的容器
[root@192 ~]# docker rm -f `docker ps -a -q -f status=exited`
批量删除所有的容器
[root@192 ~]# docker rm -f $(docker ps -a -q)
指定容器的dns
dns服务,默认采用宿主机的dns地址
1 将dns地址配置在宿主机
2 将参数配置在docker 启动脚本中 --dns=1.1.1.1
[root@192 ~]# docker run -ti --rm --dns=1.1.1.1 centos /bin/bash