docker容器学习(1)
1初识docker容器
- 在开发软件的过程中经常需要遇到研发环境,测试环境,生产环境不一致导致,需要一个跨平台可移植的环境用以完成软件开发,这个跨平台可移植的环境称为docker。

- docker用以解决软件跨环境迁移的问题
- go语言编写,诞生于2013年,使用沙箱机制,容器性能开销低
- 可以在linux,macos,windows系统上运行
2安装docker容器
以系统centos为例,安装过程如下
# 1 更新yum包
yum update
# 2 安装需要的软件包 yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3 设置安装源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 4 安装docker 出现的询问全部选择同意
yum install -y docker-ce
# 5查看 docker的版本,验证是否安装成功
docker -v
windows安装过程如下
暂无
3docker架构

- 客户端运行docker以后,相当于在客户端开了一个虚拟主机,可以在docker里面安装系统,软件等。
- docker具有镜像(image)和容器的概念。镜像是静态的,属于类的概念,根据镜像可以创建对应的容器(对象),容器是动态的。
- 镜像可以是文件系统,软件等
- 容器可以被创建,启动,停止,删除,暂停等。
- 仓库用于远程存储镜像文件的,可以从远程仓库拉取(pull)镜像使用
- 配置镜像加速器,相当于从国内的镜像源下载镜像,速度会快很多。以阿里云为例,登录阿里云,打开控制台,搜索镜像加速,按照提示的命令来完成。
4docker命令
- 在宿主机器内启动docker
systemctl start docker - 停止docker
systemctl stop docker - 重启docker
systemctl restart docker - 查看docker服务状态
systemctl status docker - 开机启动docker服务
systemctl enable docker
5docker镜像相关的命令
- 查看本地镜像
docker images - 搜索镜像
docker search mysql - 拉取镜像
docker pull mysql:5.6拉取docker的5.6版本。查看软件的版本,需要去docker hub官网上查找。 - 删除镜像
docker rmi IMAGE_ID,通过镜像的ID删除镜像或者通过镜像的版本号删除镜像docker rmi mysql:5.6冒号后面跟版本号 - 查看所有的镜像ID
docker images -q,返回所有镜像的列表 - 如果想要删除所有的镜像,可以执行以下命令
docker rmidocker images -q
6docker容器相关命令
- 容器是镜像的实例,是动态的,以下是相关命令。
- 查看容器。
docker ps,查看所有的容器docker ps -a - 创建容器。有两个命令
docker -it --name=C1 centos:7 /bin/bash。参数-i,以交互的模式运行容器,保证可以往容器里面输入内容,-t为容器创建一个w伪终端。以-it创建的容器退出就停止容器。--name=指明容器的名称。/bin/bash容器启动以后执行这个命令。docker -id --name=C2 centos:7 /bin/bash。参数-id在后台创建容器不进入容器(守护式容器)。退出不会停止容器。 - 进入容器。
docker exec -it C2 /bin/bash - 退出容器。
exit - 启动容器。
docker start C2 - 停止容器。
docker stop C2 - 删除容器。
docker rm C1。查看所有的容器IDdocker ps -aq。删除所有的容器。docker rmdocker ps -aq - 查看容器信息。
docker inspect C2
7容器的数据卷
- 数据卷的概念和作用。数据卷是为了容器删除以后,保证容器产生的数据依旧存在而设置的。外部客户端可以通过数据卷与容器进行数据交换。容器之间数据交换也是通过数据卷。数据卷是宿主机上的一个目录或文件(也可以理解为快捷方式或者软连接)。当容器目录和数据卷绑定以后,修改会同步。

- 配置数据卷。创建容器时指定数据卷
docker -it -v 宿主机目录(文件):容器内目录(文件) --name=C3 centos:7 /bin/bash。参数-v绑定主机内的目录到容器内,这样两者的修改就会同步。注意路径必须是绝对路径。同一个目录可以被多个容器绑定。

- 配置数据卷容器。当挂载的数据卷越多,数据卷管理就会混乱,这是需要一个数据卷容器帮助管理数据卷。

- 如上图所示,首先将容器C3和数据卷绑定
docker run -it --name=C1 -v volume centos:7 /bin/bash,之后再创建C1,C2绑定容器C3,这样三者共绑定一个数据卷。命令如下docker run -it --name=C1 --volumes-from C3 centos:7 /bin/bash和docker run -it --name=C2 --volumes-from C3 centos:7 /bin/bash。设置数据卷容器,宿主机会自动设置一个目录存放数据卷。
8docker应用部署
docker应用部署一般可以分为以下部分。1搜索应用镜像2拉取应用镜像3创建容器4操作镜像容器,下面是四个常用的例子。 - 部署mysql

外部机器不能直接和容器进行通信,需要先通过宿主机器的端口,然后转发到容器的监听端口。这种称为端口映射。
# 搜索mysql镜像
docker search mysql
# 拉取mysql镜像
docker pull mysql:5.6
# 创建一个文件夹,用于存储mysql信息,并且进入
mkdir ~/mysql
cd ~/mysql
# 创建容器,设置端口映射
docker run -id \ # 后台创建容器
--name=c_mysql # 设置容器的名称
-p 3307:3306 \ # 设置端口映射
-v $PWD/conf:/etc/mysql/conf.d \ # 设置数据卷 宿主机使用绝对路径 配置目录
-v $PWD/logs:/logs \ # 日志目录
-v $PWD/data:/var/libs/mysql\ # 数据目录
-e MYSQL_ROOT_PASSWORD=123456 \ # 设置root账户的登录密码
mysql:5.6
# 创建完容器,进入容器,使用mysql语句就可以对容器进行操作
- 部署tomcat
docker search tomcat
docker pull tomcat
mkdir ~/tomcat
cd ~/tomcat
docker run -id \
--name=c_tomcat \
-p 8080:8080 \
-v $PWD:/usr/local/tomcat/webapps \
tomcat
- 部署nginx 反向代理
user nginx;
worker_processes 1;
error_1og /var/1og/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]"Sreguest" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_1og /var/log/nginx/access.1og main;
sendfi]e on;
# tcp_nopush on;
keepalive_timeout 65:
# gzip on;
include /etc/nginx/conf.d/*.conf;
}
docker search nginx
docker pull nginx
mkdir ~/nginx
cd ~/nginx # 需要新建一个配置文件
vim nginx.conf # 将上面的文件放入 nginx.conf
docker run -id --name=c_nginx \
-p 80:80 \
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \ # 配置目录
-v $PWD/logs:/var/log/nginx \ # 日志目录
-v $PWD/html:/usr/share/nginx/html \ # 访问的文件夹
nginx
```
- 部署redis
```bash
docker search redis
docker pull redis:5.0
dicker run -id \
--name=c_redis \
-p 6379:6379 \
redis:5.0
外部机器连接redis,在当前目录下
redis-cli.exe -h ip地址 -p 6379
9镜像原理

docker的本质是一个分层文件系统,cenos镜像小是因为复用了操作系统的bootfs,只暴露出rootfs和其他镜像。tomcat镜像存储大,是因为存储包含了需要依赖的父镜像和基础镜像。
10将容器转换为镜像

镜像的压缩文件可以在不同容器之间进行传播,通过拉取旧镜像创建一个容器,在转换为一个镜像就可以在不同容器之间进行传播。相关命令如下
docker commit 容器id 镜像名称:版本号
docker save -o 压缩文件名称 镜像名称:版本号
docker load -i 压缩文件名称
11初识dockerfile
- docker是一个文本文件,包含了一条条指令,通过这些指令可以构建出一个新的镜像
- 可以认为dockerfile提供了一个完全一直的开发环境。
- 在dockerhub查看相关命令。不用专门去学相关命令,遇到了再去查找相关资料。
12dockerfile部署springboot项目
打包springboot项目为jar文件,可以运行java -jar 路径\xxx.jar文件
dockerfile构建镜像命令docker build -f dockerfile文件路径 -t 镜像名称:镜像版本,dockerfile的文件内容如下:
# 1 定义父镜像
# 2 定义作者信息
# 3 将jar包添加到容器
# 4 定义容器启动执行的命令
# 5 通过dockefile构建进行
FROM java:8 # 需要的基础镜像
MAINTAINER wayne<wayne@163.com> # 作者信息
ADD springboot_name.jar new_name_app.jar # 需要添加的文件
CMD java -jar new_name_app.jar # 容器启动以后 运行的命令
13dockerfile自定义centos
- 要求登录以后自动进入
/usr文件夹 - 要求进入以后可以使用vim编辑器 dockerfile文件内容如下:
FROM centos:7
MAINTAINER wayne<wayne@163.com>
RUN yum install -y vim # 运行命令 含义:使用yum安装vim工具
WORKDIR /usr # 定义工作目录
CMD /bin/bash # 容器启动以后启动命令
14docker中compose的安装和使用
微服务架构的应用系统一般包括若干个微服务,每个微服务都会部署多个实例,维护的工作量很大,简而言之,可能需要创建很多个容器,并且需要手动停止。 docker compose服务编排是一个编排多容器分布式部署的工具,提供容器管理的完整开发周期,使用步骤如下: - 利用dockerfile提供环境依赖 - 使用docker-compose.yml定义组成的应用各个服务 - 运行docker-compose 启动应用 相关命令如下:
# 1 安装 docker compose
# 2 卸载 docker compose
rm 安装路径/docker-compose
# 3 使用docker compose 编排nginx+springboot项目
# 创建 docker_compose文件夹并进入
# 创建并编辑 docker-compose.yml
docker-compose.yml的内容如下:
version: "3"
5ervices:
nginx:
image: nginx
ports:
- 80:80
links:
- app
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
app:
image: app
expose:
- "8080"
创建./nginx/conf.d,并编辑内容如下:
server {
listen 80;
access_log off;
location / {
proxy_pass http://app:8080;
}
}
最后在docker-compose.yml目录下,执行命令docker-compose up
15docker私有仓库
可以将自己制作的镜像放入到公网中,有时不想将自己的镜像放入到公网,可以将镜像推到自己的云服务器中。