Docker

docker

Docker介绍

Docker 是一个开源的应用容器引擎,基于 Go 语言开发。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低

Docker应用场景

  • Web 应用的自动化打包和发布

  • 自动化测试和持续集成、发布

  • 在服务型环境中部署和调整数据库或其他的后台应用

Docker应用场景

Docker结构

Docker组成结构

Docker 镜像(Images):Docker 镜像是用于创建 Docker 容器的模板,镜像是基于联合文件系统的一种层式结构,由一系列指令一步一步构建出来

Docker 容器(Container):容器是独立运行的一个或一组应用。镜像相当于类,容器相当于类的实例

Docker 客户端(Client):Docker 客户端通过命令行或者其他工具使用 Docker API 与 Docker 的守护进程通信

Docker 主机(Host): 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器

Docker守护进程: Docker服务器端进程,负责支撑Docker 容器的运行以及镜像的管理

Docker仓库:DockerHub (Registry) Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库
Docker Hub提供了庞大的镜像集合供使用。用户也可以将自己本地的镜像推送到Docker仓库供其他人下载

Docker安装与操作

安装过程

1
2
3
4
5
6
7
8
9
10
11
# 1、yum 包更新到最新 
sudo yum update
# 2、作用:安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 3、 设置yum源
# 使用ustc的(推荐)
sudo yum-config-manager --add-repo http://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
# 4、 安装docker;出现输入的界面都按 y
sudo yum install -y docker-ce
# 5、 查看docker版本
docker -v

配置镜像

1
2
3
# 执行如下命令: 
mkdir /etc/docker
vi /etc/docker/daemon.json
  • daemon.json
1
2
3
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}

Docker启动与停止指令

1
2
3
4
5
6
7
8
9
10
# 启动docker服务: 
systemctl start docker
# 停止docker服务:
systemctl stop docker
# 重启docker服务:
systemctl restart docker
# 查看docker服务状态:
systemctl status docker
# 设置开机启动docker服务:
systemctl enable docker

Docker操作镜像指令

  • 查看本地镜像
1
2
# 查看镜像 
docker images

REPOSITORY:镜像名称

TAG:镜像标签

IMAGE ID:镜像ID

CREATED:镜像的创建日期

SIZE:镜像大小

  • 搜索镜像
1
2
# 从网络中查找需要的镜像 
docker search 镜像名称

NAME:镜像名称

DESCRIPTION:镜像描述

STARS:用户评价,反应一个镜像的受欢迎程度

OFFICIAL:是否官方

AUTOMATED:自动构建,表示该镜像由Docker Hub自动构建流程创建的

  • 拉取镜像
1
2
3
4
# 拉取镜像就是从Docker仓库下载镜像到本地,镜像名称格式为 名称:版本号,如果版本号不指定则是最新的版本
docker pull 镜像名称
# 如拉取centos 7;
docker pull centos:7
  • 删除镜像
1
2
3
4
5
# 可以按照镜像id删除镜像: 
docker rmi 镜像id

# 删除所有镜像
docker rmi docker images -q

Docker操作容器指令

  • 查看容器
1
2
3
4
查看正在运行的容器使用命令:
docker ps
查看所有容器使用命令:
docker ps -a

创建容器

  • 交互式容器

启动完成后,直接进入当前容器。使用exit命令退出容器。需要注意的是以此种方式启动容器,如果退出容器,则容器会进入停止状态

1
2
3
4
# 拉取一个镜像
docker pull centos:7
# 创建并启动名称为 mycentos7 的交互式容器
docker run -it --name=xiaobocentos1 centos:7 /bin/bash
  • 守护式容器

启动完成后长期运行,不直接进入容器

1
2
3
4
#创建并启动守护式容器 
docker run -di --name=ydlcentos2 centos:7
#登录进入容器命令为:docker exec -it container_name (或者 container_id) /bin/bash(exit退出 时,容器不会停止)
docker exec -it xiaobocentos2 /bin/bash

停止并启动容器

1
2
3
4
# 停止正在运行的容器:docker stop 容器名称或者ID 
docker stop xiaobocentos2
# 启动已运行过的容器:docker start 容器名称或者ID
docker start xiaobocentos2

文件拷贝

宿主机拷贝到容器

1
2
3
4
5
6
7
8
9
10
11
12
13
# docker cp 需要拷贝的文件或目录 容器名称:容器目录

# 创建一个文件
touch xiaobo.txt

# 复制文件到xiaobocentos2的容器的 / 目录下
docker cp xiaobo.txt xiaobocentos2:/root

# 进入xiaobocentos2容器
docker exec -it xiaobocentos2 /bin/bash

# 查看容器 / 目录下文件
ll

容器拷贝到宿主机

1
2
3
4
5
6
7
8
9
10
# docker cp 容器名称:容器目录 需要拷贝的文件或目录

#进入容器后创建文件
touch xiaobo.log

# 退出容器
exit

# 在Linux宿主机器执行复制;将容器xiaobocentos2的文件复制到宿主机器的/root目录下
docker cp xiaobocentos2:/root/xiaobo.log /root

目录挂载

可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而同步容器

创建容器时添加-v参数

1
2
3
4
5
6
7
8
9
10
11
12
13
# 创建linux宿主机器要挂载的目录 
mkdir /root/binlog

# 创建并启动容器xiaobocentos3 ,并挂载linux中的/root/binding 目录到容器的/root/binding 也就是在 linux中的/root/binding 中操作相当于对容器相应目录操作
docker run -di -v /root/binding:/root/binding --name=xiaobocentos3 centos:7

# 在linux下创建文件
touch /root/binding/xiaobo.log

# 进入容器 docker exec -it xiaobocentos3 /bin/bash

# 在容器中查看目录中是否有对应文件def.txt
ll /root/binding

如果是多级的目录,可能现权限不足,需要添加参数--privileged=true解决挂载的目录没有权限的问题

查看容器ip

1
2
# 在linux宿主机下查看 xiaobocentos3 的ip 
docker inspect xiaobocentos3

容器中有一个局域网,宿主机有一个ip,所以外部访问需要通过宿主机端口代理

删除容器

1
2
# 删除容器 
docker rm xiaobocentos3

部署软件

Mysql容器部署

  • 搜索mysql
1
docker search mysql
  • 拉取mysql镜像
1
docker pull mysql:8.0
  • 修改配置
1
2
3
# 在/root目录下创建mysql目录用于存储mysql数据信息
mkdir /root/mysql
cd /root/mysql
1
2
3
4
5
6
7
8
docker run -id \
-p 3307:3306 \
--name=xiaobo_mysql \
-v /root/mysql/conf:/etc/mysql/conf.d \
-v /root/mysql/logs:/logs \
-v /root/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=xiaobo \
mysql:8.0

-p 3307:3306 将容器的 3306 端口映射到宿主机的 3307 端口

-v /root/mysql/conf:/etc/mysql/conf.d \ 将主机当前目录下的my.cnf 挂载到容器

-v /root/mysql/logs:/logs \ 将主机当前目录下的 logs 目录挂载到容器的 /logs 日志目录

-v /root/mysql/data:/var/lib/mysql \ 将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 数据目录

-e MYSQL_ROOT_PASSWORD=xiaobo \ 初始化 root 用户的密码

  • 进入mysql容器
1
docker exec -it xiaobo_mysql /bin/bash
  • 测试连接即可

Tomcat部署

  • 搜索tomcat
1
docker search tomcat
  • 拉取Tomcat镜像
1
docker pull tomcat
  • 配置
1
2
3
# 在/root目录下创建tomcat目录用于存储tomcat数据信息
mkdir /root/tomcat
cd /root/tomcat
1
2
3
4
docker run -id --name=xiaobo_tomcat \
-p 8081:8080 \
-v /root/tomcat:/usr/local/tomcat/webapps \
tomcat

Nginx部署

  • 搜索
1
docker search nginx
  • 拉取Nginx镜像
1
docker pull nginx
  • 修改配置
1
2
3
4
5
6
7
# 在/root目录下创建nginx目录用于存储nginx数据信息
mkdir /root/nginx
cd /root/nginx
mkdir conf
cd conf
# 在~/nginx/conf/下创建nginx.conf文件,粘贴下面内容
vim nginx.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
user  nginx;
worker_processes 1;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;


events {
worker_connections 1024;
}


http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

sendfile on;
#tcp_nopush on;

keepalive_timeout 65;

#gzip on;

include /etc/nginx/conf.d/*.conf;
}
1
2
3
4
5
6
docker run -id --name=xiaobo_nginx \
-p 80:80 \
-v /root/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /root/nginx/logs:/var/log/nginx \
-v /root/nginx/html:/usr/share/nginx/html \
nginx

redis部署

  • 搜索
1
docker search redis
  • 拉取Redis镜像
1
docker pull redis:5.0
  • 端口映射
1
docker run -id --name=xiaobo_redis -p 6380:6379 redis:5.0
  • 客户端连接
1
redis-cli.exe -h 192.168.117.200 -p 6380

docker-compose

ompose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。它是一个定义和运行多容器的docker应用工具。使用compose,通过YMAL文件配置你自己的服务,然后通过一个命令,你能使用配置文件创建和运行所有服务

安装

1
2
3
4
5
6
7
curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose 

# 设置文件可执行权限
chmod +x /usr/local/bin/docker-compose

# 查看版本信息
docker-compose -version

卸载

1
2
# 二进制包方式安装的,删除二进制文件即可 
rm /usr/local/bin/docker-compose

常用命令官网查看即可

compose模板

1
2
3
4
5
6
7
8
version: "2" 
services:
web:
images: nginx
ports: -"8080:80"
volumes: - /usr/local/abc:/usr/local/cba
#volumes:
#networks:
  • services

服务,在它下面可以定义应用需要的一些服务,每个服务都有自己的名字、使用的镜像、挂载的数据卷、所属的网络、依赖哪些其他服务等等

  • volumes

数据卷,在它下面可以定义的数据卷(名字等等),然后挂载到不同的服务下去使用

  • networks

应用的网络,在它下面可以定义应用的名字、使用的网络类型等等

compose应用

  • 创建模板
1
2
3
4
5
6
# 创建文件夹
mkdir -p /usr/local/mycompose
#进入文件夹
cd /usr/local/mycompose
#创建 docker-compose.yml文件;内容如下
vi docker-compose.yml
  • docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
version: '3'
services:
redis1:
image: redis
ports:
- "6379:6379"
container_name: "redis1"
networks:
- dev
mysql1:
image: centos/mysql-57-centos7
environment:
MYSQL_ROOT_PASSWORD: "root"
ports:
- "3306:3306"
container_name: "mysql1"
networks:
- dev
web1:
image: tomcat
ports:
- "9090:8080"
container_name: "web1"
networks:
- dev
- pro
networks:
dev:
driver: bridge
pro:
driver: bridge

仓库的迁移和备份

迁移备份

  • 容器转镜像
1
2
# 保存nginx容器为镜像 
docker commit 容器名称 镜像名称
  • 镜像备份
1
docker save –o tar文件名 镜像名
  • 镜像恢复和迁移
1
2
3
4
5
6
7
8
9
10
# 停止mynginx容器 
docker stop xiaobocentos1
# 删除mynginx容器
docker rm xiaobocentos1
# 删除mynginx镜像
docker rmi xiaobocentos1
# 加载恢复mynginx镜像
docker load -i xiaobocentos1.tar
# 在镜像恢复之后,基于该镜像再次创建启动容器
docker run -di --name=xiaobocentos1 xiaobocentos1

Dockerfile

简单明了,创建镜像的

  • 创建jdk1.8镜像
1
2
3
4
5
6
7
8
# 1、创建目录 
mkdir –p /usr/local/dockerjdk8
cd /usr/local/dockerjdk8

# 2、下载jdk-8u231-linux-x64.tar.gz并上传到服务器(虚拟机)中的/usr/local/dockerjdk8目录

# 3、在/usr/local/dockerjdk8目录下创建Dockerfile文件,文件内容如下:
vi Dockerfile
  • Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FROM centos:7 
MAINTAINER ITLILS
WORKDIR /usr
RUN mkdir /usr/local/java
ADD jdk-8u231-linux-x64.tar.gz /usr/local/java/
ENV JAVA_HOME /usr/local/java/jdk1.8.0_231
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

# 4、执行命令构建镜像;不要忘了后面的那个 .
docker build -t='jdk1.8' .

# 5、查看镜像是否建立完成
docker images
  • 创建刚刚的容器
1
2
3
4
# 创建并启动容器 
docker run -it --name=testjdk jdk1.8 /bin/bash
# 在容器中测试jdk是否已经安装
java -version

搭建私有仓库

  • 创建目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 1、拉取私有仓库镜像 
docker pull registry

# 2、启动私有仓库容器
docker run -id --name=registry -p 5000:5000 registry

# 3、打开浏览器 输入地址http://私有仓库服务器ip:5000/v2/_catalog,看到{"repositories":[]} 表示私有仓库 搭建成功

# 4、修改daemon.json
vim /etc/docker/daemon.json

# 在上述文件中添加一个key,保存退出。此步用于让 docker 信任私有仓库地址;注意将私有仓库服务器ip修改为自己私有仓库服务器真实ip
{"insecure-registries":["私有仓库服务器ip:5000"]}

# 5、重启docker 服务
systemctl restart docker
docker start registry
  • 镜像上传到私有服务器
1
2
3
4
5
# 1、标记镜像为私有仓库的镜像     
docker tag redis:5.0 192.168.117.200:5000/redis:5.0

# 2、上传标记的镜像
docker push 192.168.117.200:5000/redis:5.0

其它服务器拉取私有仓库镜像

1
2
3
4
5
6
7
8
9
# 打开配置文件 
vi /usr/lib/systemd/system/docker.service

# 在打开的上述文件中按照下面的图,添加如下的内容;注意修改下面内容中的ip地址
--add-registry=ip地址:5000 --insecure-registry=ip地址:5000 \

# 修改完后需要重新加载docker配置文件并重启docker
systemctl daemon-reload
systemctl restart docker

重启之后直接拉取即可

容器和虚拟机对比

相同

具有相似的资源隔离和分配优势

不同

容器虚拟化的是操作系统,虚拟机虚化的是硬件

虚拟机可以运行不同的操作系统,容器只能运行相同的操作系统

正确的开始 微小的长进 然后持续 嘿 我是小博 带你一起看我目之所及的世界……

-------------本文结束 感谢您的阅读-------------

本文标题:Docker

文章作者:小博

发布时间:2022年10月31日 - 20:33

最后更新:2022年10月31日 - 20:35

原始链接:https://codexiaobo.github.io/posts/4126800539/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。