Skip to content

Docker

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

shell
yum install -y yum-utils device-mapper-persistent-data lvm2

为yum源添加docker仓库位置

官方

shell
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  • 国内
shell
# 设置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

text
# 旧版弃用
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

text
#状态
systemctl status docker
#启动:
systemctl start docker
#设置开机启动:
systemctl enable docker
#停止:
systemctl stop docker

img

验证

docker version

或者

docker info

img

虚拟机常见问题

  • 在win10下安装VM,在VM里运行docker,使用docker pull拉取镜像时报错
text
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 配置国内源地址:

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
}
  • 配置刷新
bash
systemctl daemon-reload
  • 重新启动
bash
systemctl restart docker  

# 或

systemctl restart docker.service

查看日志状态

systemctl status docker.service

img

Docker存放目录

cd /var/lib/docker

卸载Docker

注意: 卸载命令谨慎执行不可逆

sh
# 卸载
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

img

搜索镜像

shell
docker search java

下载镜像

shell
docker pull java:8

列出镜像

shell
docker images

删除镜像

shell
docker rmi java:8
#强制
docker rmi -f java:8
#删除没用的镜像
docker rmi `docker images | grep none | awk '{print $3}'`
#删除所有【慎用】
docker rmi -f $(docker images)

删除没用的镜像

shell
#删除没用的镜像
docker rmi `docker images | grep none | awk '{print $3}'`

删除所有镜像

shell
#删除所有【慎用】
docker rmi -f $(docker images)

打包镜像

shell
# -t 表示指定镜像仓库名称/镜像名称:镜像标签 .表示使用当前目录下的Dockerfile文件
docker build -t mall/mall-admin:1.0-SNAPSHOT .

推送镜像

shell
# 登录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存档

bash
# 保存iamge
docker save -o file.tar 镜像名/镜像ID
# 导入image
docker load --input file

Docker基础命令

bash
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

新建并启动容器

shell
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:表示容器以后台方式运行。

列出容器

shell
#列出运行中的容器
docker ps
#列出所有容器
docker ps -a

停止容器

注意:$ContainerName表示容器名称,$ContainerId表示容器ID,可以使用容器名称的命令,基本也支持使用容器ID,比如下面的停止容器命令。

shell
docker stop $ContainerName(or $ContainerId)
# 例如
docker stop nginx
#或者
docker stop c5f5d5125587

强制停止容器

shell
docker kill $ContainerName

启动容器

shell
docker start $ContainerName

进入容器

shell
docker inspect --format "{{.State.Pid}}" $ContainerName
  • 根据容器的pid进入容器
shell
nsenter --target "$pid" --mount --uts --ipc --net --pid

删除容器

  • 删除指定容器
shell
docker rm $ContainerName
  • 按名称通配符删除容器,比如删除以名称mall-开头的容器
shell
docker rm `docker ps -a | grep mall-* | awk '{print $1}'`
  • 强制删除所有容器
shell
docker rm -f $(docker ps -a -q)

查看容器日志

  • 查看容器的日志
shell
docker logs $ContainerName
  • 实时查看容器的日志
shell
docker logs -f $ContainerName

查看容器的IP地址

shell
docker inspect --format '{{ .NetworkSettings.IPAddress }}' $ContainerName

修改容器的启动方式

shell
# 将容器启动方式改为always
docker container update --restart=always $ContainerName

同步宿主机时间到容器

shell
docker cp /etc/localtime $ContainerName:/etc/

指定容器时区

shell
docker run -p 80:80 --name nginx \
-e TZ="Asia/Shanghai" \
-d nginx:1.17.0

查看容器占用资源

  • 查看指定容器资源占用状况,比如cpu、内存、网络、io状态:
shell
docker stats $ContainerName
  • 查看所有容器资源占用情况:
shell
docker stats -a
  • 查看容器磁盘使用情况
shell
docker system df
  • 执行容器内部命令
shell
docker exec -it $ContainerName /bin/bash
  • 指定账号进入容器内部
shell
# 使用root账号进入容器内部
docker exec -it --user root $ContainerName /bin/bash

网络设置

  • 查看所有网络
shell
docker network ls
  • 创建外部网络
shell
docker network create -d bridge my-bridge-network
  • 指定容器网络
shell
docker run -p 80:80 --name nginx \
--network my-bridge-network \
-d nginx:1.17.0

修改镜像的存放位置

  • 查看Docker镜像的存放位置
shell
docker info | grep "Docker Root Dir"
  • 关闭Docker服务
shell
systemctl stop docker
  • 先将原镜像目录移动到目标目录
shell
mv /var/lib/docker /mydata/docker
  • 建立软连接
shell
ln -s /mydata/docker /var/lib/docker
  • 再次查看可以发现镜像存放位置已经更改

Docker容器清理

  • 查看Docker占用的磁盘空间情况
shell
docker system df
  • 删除所有关闭的容器
shell
docker ps -a | grep Exit | cut -d ' ' -f 1 | xargs docker rm
  • 删除所有dangling镜像(没有Tag的镜像)
shell
docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
  • 删除所有dangling数据卷(即无用的 volume)
shell
docker volume rm $(docker volume ls -qf dangling=true)

安装Docker-compose

版本查询 地址: github地址

  • 选择自己想要安装的版本 修改以下语句版本号
bash
curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
  • 备选地址
shell
curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

img

  • 手动安装

手动下载(各种渠道 比如百度)

博主已经下载好了(1.27.4 与 2.2.2 版本) 并上传到gitee 地址: 博主资源地址

下载好之后 上传到系统 /usr/local/bin 目录 并改名为 docker-compose

  • 授权
bash
chmod +x /usr/local/bin/docker-compose
  • 检查版本

docker-compose -version

docker-compose version

img

docker-compose.yml常用命令

  • image 指定运行的镜像名称
yaml
# 运行的是mysql5.7的镜像
image: mysql:5.7
  • container_name 配置容器名称
yaml
# 容器名称为mysql
container_name: mysql
  • ports 指定宿主机和容器的端口映射(HOST:CONTAINER)
yaml
# 将宿主机的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)
yaml
# 可以以database为域名访问服务名称为db的容器
links:
  - db:database

编写docker-compose.yml文件

yaml
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常用命令

构建、创建、启动相关容器

shell
# -d表示在后台运行
docker-compose up -d

指定文件启动

shell
docker-compose -f docker-compose.yml up -d

停止所有相关容器

shell
docker-compose stop

列出所有容器信息

shell
docker-compose ps

Docker常见问题

  • 如果出现yum源添加失败,备选方案

1 进入/etc/yum.repos.d目录: cd /etc/yum.repos.d

2 查看并删除/etc/yum.repos.d目录下所有的配置文件

bash
#查看当前目录的所有文件
ll
#删除当前的所有文件
rm -rf ./*

1.png

3 下载centos8的镜像源

bash
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo

1.png

4 建立缓存

bash
#查看文件
ls
#清除所有文件
yum -y clean all
#建立缓存
yum -y makecache

5 查看yum仓库信息

bash
yum repolist

2.png

这样就安装好yum源了,接下来想安装什么都可以了

  • 启动Docker报错
bash
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

1.png

Released under the MIT License.