docker分为docker CE 和docker EE,CE即免费社区版,EE即企业付费版。下面基于centos7安装docker CE,其它linux版本可以参考官方文档https://docs.docker.com/install/linux/docker-ce/centos/。docker CE支持64位CENTOS7,并且内核版本不低于3.10,查看当前linux内核版本 uname -r,如果内核版本不符合要求,要先升级内核版本,有两种安装方式yum安装和脚本安装。
yum源安装
卸载旧的docker sudo yum remove docker 安装 sudo yum install docker-ce ,如果提示没有可用的软件包,则安装相应的依赖包 安装相关依赖包 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 加载docker-ce yum源 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
脚本安装
获取脚本 curl -fsSL https://get.docker.com -o get-docker.sh 执行 sudo sh get-docker.sh --mirror Aliyun
设置docker开机启动
sudo ststemctl enable docker
默认情况下 docker命令会使用unix socket与docker引擎通信,但是只有root和docker组的用户才可以,所以需要将使用docker的用户添加到docker用户组下
sudo groupadd docker
sudo usermod -aG docker $USER
校验是否安装成功
docker run hello-world 是否有对应输出
docker卸载
sudo yum remove docker-ce
配置镜像加速
docker info 可以查看docker配置信息 vim /etc/docker/daemon.json,没有deamon.json则创建一个,加入如下配置 { "registry-mirrors":[ "http://hub-mirror.c.163.com" ] } 重启后生效 sudo systemctl daemon-reload sudo systemctl restart docker
docker 基本操作
docker 获取镜像 docker pull [选项] [仓库地址[:端口号]/] 仓库名:[标签] docker search 搜索可用镜像 docker pull --help 查看可用参数 默认仓库地址为docker hub 默认用户名为 library 例如 docker pull ubuntu:16.04 将拉取 docker 官方地址下library/ubuntu下16.04版本的镜像 运行镜像 docker run -it -rm ubuntu:16.04 bash 容器启动后将进入容器,执行exit退出容器 -i 交互式操作 -t 启动终端 -rm 退出后删除容器 bash 容器启动后执行的命令 列出镜像 docker image ls 或者 docker images 查看镜像、容器、数据卷所占用的空间 docker system df 仓库名、标签均为NONE的镜像称为虚悬镜像,没有什么价值 docker images -f dangling=true 删除虚悬镜像 docker image prune 删除本地镜像 镜像删除前必须确保该镜像没有对应的容器实例 docker image rm [选项] [镜像1] [镜像2] 其中镜像可以是镜像id或者镜像名 批量删除镜像 docker image rm ${docker image ls -q redis} 删除所有redis镜像 删除所有ubuntu:16.04以前的镜像 docker image rm ${docker image ls -q -f before=ubuntu:16.04} 删除容器 docker ps -a 查看容器 docker rm -f 容器id 删除容器 docker container prune 删除所有停止的容器 容器操作 docker run [image]创建并启动容器 docker start [容器id或者容器名字] 启动已创建的容器 docker run -it ubuntu:16.04 /bin/bash 启动并进入容器
后台运行 加入 -d参数,此时控制台不会再打印日志 docker容器是否长久运行和run指定的命令有关 和-d参数无关 后台运行后可以通过 docker logs 容器id查看对应的日志 进入正在运行的容器 docker exec -it 容器id /bin/bash 导出和导入容器 docker export 容器id >导出文件名.tar 导入镜像 cat hello.tar | docker import - study/hello:1.0 运行导入的镜像的时候必须带command,具体命令可以通过docker ps -a 看到
docker save 和docker load 保存和加载镜像
docker save nginx | gzip > nginx.tar.gz
docker load -i nginx.tar.gz
基于Dockerfile创建镜像
Dockerfile构建镜像. 在Dockerfile 所在目录下 执行docker build -t mynginx:1.0 . 构建镜像,常用命令如下 FROM 指定基础镜像 可以是服务镜像(nginx,redis),也可以是操作系统(centos,ubuntu),还有一个特殊镜像scratch,表示空白镜像 RUN 用来执行命令行命令,其格式有两种 shell格式 RUN echo '<h1>hello,hehang</h1>' > /usr/share/nginx/html/index.html, EXEC格式 RUN tar -xzf redis.tar.gz -C /usr/local COPY 两种格式 COPY <源路径>...<目标路径> COPY [<源路径>,...<目标路径>] 源路径可以是多个,COPY指令将从构建上下文目录中<源文件>的目录/文件复制到新的一层镜像的目标路径,例如 copy redis.conf /usr/local/redis/ 源路径使用通配符,例如 COPY hom* /mydir/ ADD 和COPY性质一样,文件复制使用COPY,仅在需要自动解压缩的场合使用ADD CMD 和RUN类似 shell格式 CMD 命令 exec CMD [可执行文件 参数] 参数列表格式 在使用ENTRYPOINT后用CMD指定具体的参数 ENTRYPOINT 和CMD一样,用于指定容器启动程序即参数 docker run --entrypoint,当使用了ENTRYPOINT后CMD指令含义发生了变化,不再是执行其后的命令,
而是将CMD的内容作为参数传递给ENTRYPOINT指令 ENV 指定环境变量 ENV <key><value> 或者ENV <key1=value1> <key2>=<value2> 无论是其后的指令RUN等或者程序运行时都可以使用这里定义的环境变量 $key ARG 构建参数,和ENV一样,不同的是ARG所设置的环境变量在容器运行时是不存在的,Dockerfile中ARG是定义参数名称即默认值,在创建镜像时可以用-build-arg <参数名> = <值>来覆盖 VOLUME 定义匿名卷 格式为[<路径1>,<路径2>]或者 VOLUME <路径1>,容器运行时应尽量保持容器存储层不发生写操作,对于数据库类需要动态保存数据的应用应该将数据文件保存在VOLUME中,
为了防止运行时用户忘记讲动态文件挂载到卷中,可以在Dockerfile中事先将指定目录设置为匿名卷 容器运行时可以覆盖这个挂载设置 docker run -d -v mydata:/data ,
使用宿主机上当前mydta目录替代了匿名的挂载卷 EXPOSE 用于声明容器提供的服务端口,只是一个声明,容器运行时并不会因此启动这个端口对应的服务,这样做有两个好处 1、帮助镜像使用者理解这个镜像服务的守护端口,方便映射,
2、在运行时使用随机端口映射时,docker run -P 会自动随机映射EXPOSE的端口 WORKDIR 指定工作目录 格式WORKDIR<目录>,指定其后的各层的工作目录,因为Dockerfile是分层存储,连续的RUN命令并不是在一个进程中运行,因此在需要改变后续各层的工作目录时需要使用WORKDIR USER 和WORKDIR一样指定以后的层执行命令的身份 HEALTHCHECK 健康检查 格式HEALTHCHECK [选项] CMD <命令> 设置容器健康检查的命令 ,例如发送http请求、ping等 ONBUILD 后面跟其它指令,如RUN,COPY,这些指令在构建当前镜像不会执行,只有以当前镜像为基础构建下层镜像才会被使用
docker仓库
推送自己的镜像到dockerhub
注册dockerhub用户,登陆后 docker push 可以推送自己的镜像到dockerhub docker tag 镜像id 用户名/仓库名:标签 ,将镜像重新命名 docker push 用户名/仓库名:标签 推送镜像
搭建本地仓库
docker run --name registry -d -p 5000:5000 --restart=always -v /opt/data/registry:/var/lib/registry registry docker tag session-web:latest 127.0.0.1:5000/session-web:latest docker push 127.0.0.1:5000/session-web:latest 查看 仓库中的镜像 curl 127.0.0.1:5000/v2/_catalog
默认私有仓库只支持本机push镜像,即便在同一个网段内,因为docker 默认不支持使用非HTTPS的方式推送镜像,
可以通过配置取消这个限制 vim /etc/docker/daemon.json 加入 "insecure-reistries":["127.0.0.1:5000"]
数据挂载
docker 挂载数据 两种方式 挂载数据卷(doker区域)挂载主机目录(filesystem) 创建数据卷 docker volume create my-volume 查看具体数据卷 docker volume inpect my-volume 挂载数据卷 docker run --name myweb -d -p 8080:8080 -mount source=my-volume ,target=/webapp session-web:latest 删除数据卷 docker volume rm my-volume 清理无主数据卷 docker volume prune 挂载主机目录 docker run --name myweb -d -p 8080:8080 -mount type=bind,source=my-volume ,target=/opt/webapp session-web:latest taget 必须为绝对路径 挂载单个文件到容器 docker run --name myweb -d -p 8080:8080 -mount type=bind,source=$HOME/.bash_history ,target=/root/.bash_history session-web:latest 这样可以记录容器中输入的命令