Docker
简介
Docker是一种开源的容器化平台,用于构建、部署和管理应用程序。它基于Linux容器(LXC)技术和核心虚拟化技术,提供了一种轻量级、可移植和自包含的方式来打包和运行应用程序。
Docker的核心概念是容器,它是从镜像创建的运行实例。容器提供了一个隔离的运行环境,使应用程序可以在相互独立的环境中运行,而不会受到其他容器或宿主系统的干扰。每个容器都包含了运行应用程序所需的文件系统、应用程序代码和依赖项,以及独立的网络和存储资源。
工作原理和优势
镜像(Image): 镜像是一个只读的模板,它包含了构建和运行容器所需的文件系统、应用程序代码和依赖项。镜像是构建容器的基础,可以通过编写Dockerfile来定义镜像的构建过程。
容器(Container): 容器是从镜像创建的运行实例。容器是轻量级的,独立于宿主系统,并且可以快速启动、停止和删除。通过容器,可以实现应用程序的隔离和可移植性。
仓库(Registry): 仓库是用于存储和共享Docker镜像的地方。Docker Hub是官方的公共仓库,您可以在其中找到各种官方和社区维护的镜像。此外,您还可以搭建私有仓库来管理自己的镜像。
跨平台和可移植性: Docker容器可以在不同的操作系统和硬件平台上运行,而无需修改应用程序代码。这使得开发人员能够轻松地在开发、测试和生产环境之间迁移应用程序。
资源隔离和安全性: Docker利用Linux容器技术来实现容器的资源隔离。每个容器都运行在独立的用户空间,并且无法访问宿主系统或其他容器的资源,提供了一定程度的安全性。
快速部署和可扩展性: Docker容器可以快速启动和停止,使得应用程序的部署变得简单高效。它还支持水平扩展,可以通过启动多个容器来增加应用程序的吞吐量和可用性。
CentOS 安装Docker
服务器参数
操作系统
CentOS 8.+ 64位
CPU&内存2核(vCPU)4 GiB
远程连接ECS实例,依次运行以下命令添加yum源。
安装yum-utils
yum install -y yum-utils device-mapper-persistent-data lvm2
为yum源添加docker仓库位置
官方
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- 国内
# 设置docker镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 添加docker镜像相关依赖
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
# 刷新缓存
yum makecache fast
安装docker
# 旧版弃用
yum install docker-ce
# 最新版本
yum install docker-io
- VERSION_STRING为指定的版本号
yum install docker-io-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
- 指定安装版本: 查看相应版本,地址
安装过程中会出现:Is this ok [y/d/N]: 此处填写y,然后点击Enter即可
启动docker
#状态
systemctl status docker
#启动:
systemctl start docker
#设置开机启动:
systemctl enable docker
#停止:
systemctl stop docker
验证
docker version
或者
docker info
虚拟机常见问题
- 在win10下安装VM,在VM里运行docker,使用
docker pull
拉取镜像时报错
Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
解决方案
原因:使用docker pull 命令拉取镜像时,如果不添加额外的信息如docker pull nginx,则会默认镜像拉取地址为国外仓库,导致DNS解析超时。 解决办法:
)修改VM默认的DNS为8.8.8.8 )使用国内的镜像仓库拉取镜像
配置国内源
编辑daemon.josn: vim /etc/docker/daemon.json
配置国内源地址:
{
"registry-mirrors" : [
"https://mirror.ccs.tencentyun.com",
"http://registry.docker-cn.com",
"http://docker.mirrors.ustc.edu.cn",
"http://hub-mirror.c.163.com"
],
"insecure-registries" : [
"registry.docker-cn.com",
"docker.mirrors.ustc.edu.cn"
],
"debug" : true,
"experimental" : true
}
- 配置刷新
systemctl daemon-reload
- 重新启动
systemctl restart docker
# 或
systemctl restart docker.service
查看日志状态
systemctl status docker.service
Docker存放目录
cd /var/lib/docker
卸载Docker
注意: 卸载命令谨慎执行不可逆
# 卸载
yum remove docker-ce docker-ce-cli containerd.io
# 删除镜像/容器等
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
#================================
#查询安装过的包
yum list installed | grep docker
#删除安装的软件包
yum -y remove 软件包名
#比如:
yum -y remove containerd.io
yum -y remove docker docker-common docker-selinux docker-engine
#删除镜像
rm -rf /var/lib/docker
搜索镜像
- 进入Docker Hub的官网,地址:https://hub.docker.com
- 然后搜索需要的镜像:
docker search java
下载镜像
docker pull java:8
列出镜像
docker images
删除镜像
docker rmi java:8
#强制
docker rmi -f java:8
#删除没用的镜像
docker rmi `docker images | grep none | awk '{print $3}'`
#删除所有【慎用】
docker rmi -f $(docker images)
删除没用的镜像
#删除没用的镜像
docker rmi `docker images | grep none | awk '{print $3}'`
删除所有镜像
#删除所有【慎用】
docker rmi -f $(docker images)
打包镜像
# -t 表示指定镜像仓库名称/镜像名称:镜像标签 .表示使用当前目录下的Dockerfile文件
docker build -t mall/mall-admin:1.0-SNAPSHOT .
推送镜像
# 登录Docker Hub
docker login
# 给本地镜像打标签为远程仓库名称
docker tag mall/mall-admin:1.0-SNAPSHOT macrodocker/mall-admin:1.0-SNAPSHOT
# 推送到远程仓库
docker push macrodocker/mall-admin:1.0-SNAPSHOT
从容器创建一个新的镜像
语法
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
1 OPTIONS说明:
-a :提交的镜像作者; -c :使用Dockerfile指令来创建镜像; -m :提交时的说明文字; -p :在commit时,将容器暂停。 比如:
- a404c6c174a2 为一个提交的mysql容器的ID docker commit -a "lige" -m "tthis is my mysql" a404c6c174a2 mymysql[:1.0]
Docker存档
# 保存iamge
docker save -o file.tar 镜像名/镜像ID
# 导入image
docker load --input file
Docker基础命令
docker -v #查看版本
systemctl start docker #启动docker
systemctl stop docker #停止docker
systemctl restart docker #重启docker
systemctl status docker #查看docker状态
systemctl enable docker #开机启动
docker ps #查看正在运行容器
docker ps -a #查看所有容器
docker pull nginx:1.17.0 #进行镜像的下载
docker images #列出镜像
docker rmi java:8 #指定名称删除镜像
docker rmi -f java:8 #指定名称删除镜像(强制)
docker rmi `docker images | grep none | awk '{print $3}'` #删除所有没有引用的镜像
docker rmi -f $(docker images) #强制删除所有镜像
# 打包镜像 -t 表示指定镜像仓库名称/镜像名称:镜像标签 .表示使用当前目录下的Dockerfile文件
docker build -t mall/mall-admin:1.0-SNAPSHOT .
#文件拷贝:
#1、从docker容器中拷贝出来
docker cp tomcat:/usr/local/tomcat/webapps/ /usr/local/mysofts/tomcat/
#2、从宿主机考进docker
docker cp /usr/local/mysofts/tomcat/ tomcat:/usr/local/tomcat/webapps/
#交互式命令
#使用docker时不能直接通过路径进入到docker中
#进入命令
docker exec -it <CONTAINER_ID> /bin/bash
#查看日志
docker logs -f -t --tail=100 <CONTAINER_ID>
#退出:
exit
新建并启动容器
docker run -p 80:80 --name nginx \
-e TZ="Asia/Shanghai" \
-v /mydata/nginx/html:/usr/share/nginx/html \
-d nginx:1.17.0
- -p:将宿主机和容器端口进行映射,格式为:宿主机端口:容器端口;
- --name:指定容器名称,之后可以通过容器名称来操作容器;
- -e:设置容器的环境变量,这里设置的是时区;
- -v:将宿主机上的文件挂载到宿主机上,格式为:宿主机文件目录:容器文件目录;
- -d:表示容器以后台方式运行。
列出容器
#列出运行中的容器
docker ps
#列出所有容器
docker ps -a
停止容器
注意:$ContainerName表示容器名称,$ContainerId表示容器ID,可以使用容器名称的命令,基本也支持使用容器ID,比如下面的停止容器命令。
docker stop $ContainerName(or $ContainerId)
# 例如
docker stop nginx
#或者
docker stop c5f5d5125587
强制停止容器
docker kill $ContainerName
启动容器
docker start $ContainerName
进入容器
docker inspect --format "{{.State.Pid}}" $ContainerName
- 根据容器的pid进入容器
nsenter --target "$pid" --mount --uts --ipc --net --pid
删除容器
- 删除指定容器
docker rm $ContainerName
- 按名称通配符删除容器,比如删除以名称mall-开头的容器
docker rm `docker ps -a | grep mall-* | awk '{print $1}'`
- 强制删除所有容器
docker rm -f $(docker ps -a -q)
查看容器日志
- 查看容器的日志
docker logs $ContainerName
- 实时查看容器的日志
docker logs -f $ContainerName
查看容器的IP地址
docker inspect --format '{{ .NetworkSettings.IPAddress }}' $ContainerName
修改容器的启动方式
# 将容器启动方式改为always
docker container update --restart=always $ContainerName
同步宿主机时间到容器
docker cp /etc/localtime $ContainerName:/etc/
指定容器时区
docker run -p 80:80 --name nginx \
-e TZ="Asia/Shanghai" \
-d nginx:1.17.0
查看容器占用资源
- 查看指定容器资源占用状况,比如cpu、内存、网络、io状态:
docker stats $ContainerName
- 查看所有容器资源占用情况:
docker stats -a
- 查看容器磁盘使用情况
docker system df
- 执行容器内部命令
docker exec -it $ContainerName /bin/bash
- 指定账号进入容器内部
# 使用root账号进入容器内部
docker exec -it --user root $ContainerName /bin/bash
网络设置
- 查看所有网络
docker network ls
- 创建外部网络
docker network create -d bridge my-bridge-network
- 指定容器网络
docker run -p 80:80 --name nginx \
--network my-bridge-network \
-d nginx:1.17.0
修改镜像的存放位置
- 查看Docker镜像的存放位置
docker info | grep "Docker Root Dir"
- 关闭Docker服务
systemctl stop docker
- 先将原镜像目录移动到目标目录
mv /var/lib/docker /mydata/docker
- 建立软连接
ln -s /mydata/docker /var/lib/docker
- 再次查看可以发现镜像存放位置已经更改
Docker容器清理
- 查看Docker占用的磁盘空间情况
docker system df
- 删除所有关闭的容器
docker ps -a | grep Exit | cut -d ' ' -f 1 | xargs docker rm
- 删除所有dangling镜像(没有Tag的镜像)
docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
- 删除所有dangling数据卷(即无用的 volume)
docker volume rm $(docker volume ls -qf dangling=true)
安装Docker-compose
版本查询 地址: github地址
- 选择自己想要安装的版本 修改以下语句版本号
curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
- 备选地址
curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
- 手动安装
手动下载(各种渠道 比如百度)
博主已经下载好了(1.27.4 与 2.2.2 版本) 并上传到gitee 地址: 博主资源地址
下载好之后 上传到系统 /usr/local/bin 目录 并改名为 docker-compose
- 授权
chmod +x /usr/local/bin/docker-compose
- 检查版本
docker-compose -version
docker-compose version
docker-compose.yml常用命令
- image 指定运行的镜像名称
# 运行的是mysql5.7的镜像
image: mysql:5.7
- container_name 配置容器名称
# 容器名称为mysql
container_name: mysql
- ports 指定宿主机和容器的端口映射(HOST:CONTAINER)
# 将宿主机的3306端口映射到容器的3306端口
ports:
- 3306:3306
- volumes 将宿主机的文件或目录挂载到容器中(HOST:CONTAINER)
# 将外部文件挂载到myql容器中
volumes:
- /mydata/mysql/log:/var/log/mysql
- /mydata/mysql/data:/var/lib/mysql
- /mydata/mysql/conf:/etc/mysql
- environment 配置环境变量
# 设置mysqlroot帐号密码的环境变量
environment:
- MYSQL_ROOT_PASSWORD=root
- links 连接其他容器的服务(SERVICE:ALIAS)
# 可以以database为域名访问服务名称为db的容器
links:
- db:database
编写docker-compose.yml文件
version: '3'
services:
# 指定服务名称
db:
# 指定服务使用的镜像
image: mysql:5.7
# 指定容器名称
container_name: mysql
# 指定服务运行的端口
ports:
- 3306:3306
# 指定容器中需要挂载的文件
volumes:
- /mydata/mysql/log:/var/log/mysql
- /mydata/mysql/data:/var/lib/mysql
- /mydata/mysql/conf:/etc/mysql
# 指定容器的环境变量
environment:
- MYSQL_ROOT_PASSWORD=root
# 指定服务名称
mall-tiny-docker-compose:
# 指定服务使用的镜像
image: mall-tiny/mall-tiny-docker-compose:0.0.1-SNAPSHOT
# 指定容器名称
container_name: mall-tiny-docker-compose
# 指定服务运行的端口
ports:
- 8080:8080
# 指定容器中需要挂载的文件
volumes:
- /etc/localtime:/etc/localtime
- /mydata/app/mall-tiny-docker-compose/logs:/var/logs
Docker Compose常用命令
构建、创建、启动相关容器
# -d表示在后台运行
docker-compose up -d
指定文件启动
docker-compose -f docker-compose.yml up -d
停止所有相关容器
docker-compose stop
列出所有容器信息
docker-compose ps
Docker常见问题
- 如果出现yum源添加失败,备选方案
1 进入/etc/yum.repos.d目录: cd /etc/yum.repos.d
2 查看并删除/etc/yum.repos.d目录下所有的配置文件
#查看当前目录的所有文件
ll
#删除当前的所有文件
rm -rf ./*
3 下载centos8的镜像源
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo
4 建立缓存
#查看文件
ls
#清除所有文件
yum -y clean all
#建立缓存
yum -y makecache
5 查看yum仓库信息
yum repolist
这样就安装好yum源了,接下来想安装什么都可以了
- 启动Docker报错
Job for docker.service failed because start of the service was attempted too often. See "systemctl status docker.service" and "journalctl -xe" for details.
To force a start use "systemctl reset-failed docker.service" followed by "systemctl start docker.service" again.
1 解决 cd /etc/docker/
2 把daemon.json配置文件改成daemon.conf即可,命令:mv daemon.json daemon.conf
3 sudo service docker restart