Docker之入门
一、初识Docker
1.1Docker的概念
- Docker是一个开源的应用容器引擎
- 诞生于2013年初,基于GO语言实现,dotCloud公司出品(后改名为Docker Inc)
- Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上
- 容器是完全使用沙箱机制,相互隔离
- 容器性能开销极低
- Docker从17.03版本后分为CE(Community Edition:社区版)和EE(Enterprise Edition:企业版)
总结:Docker是一种容器技术,他解决容器环境迁移问题
1.2Docker的安装
Docker可以运行在MAC、Windows、CentOS、UBUNTU等操作系统上,本章基于CentOS 7 安装Docker。
官网:https://www.docker.com
# 1.yum包更新到最新
yum update
# 2.安装需要的软件包,yum-util提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3.设置yum源
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
可以参考官网https://docs.docker.com/engine/install/centos/
镜像加速器
阿里云镜像获取地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors,登陆后,左侧菜单选中镜像加速器就可以看到你的专属地址了:
在/etc/docker/daemon.json,文件末尾增加如下内容
{
"registry-mirrors": ["https://你的ID.mirror.aliyuncs.com"]
}
1.3Docker的架构
- 镜像(Image)
Docker镜像,就相当于是一个root文件系统。比如官方镜像ubuntu:16.04就包含了完整的一套Ubuntu16.04最小系统的root文件系统 - 容器(Container)
镜像和容器的关系,就像是面向对象程序设计中的类和对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等 - 仓库(Repository)
仓库可看成代码控制中心,用以保存镜像
二、Docker命令
2.1进程相关命令
启动docker服务
systemctl start docker
停止docker服务
systemctl stop docker
重启docker服务
systemctl restart docker
查看docker服务状态
systemctl status docker
设置开机启动docker服务
systemctl enable docker
2.2镜像相关命令
查看镜像:查看本地所有镜像
docker images
docker images -q #查看所用镜像的id
搜索镜像:从网络中查找需要的镜像
docker search 镜像名称
docker search redis #查找redis镜像
拉取镜像:从Docker仓库下载镜像到本地
docker pull 镜像名称
docker pull redis #下载最新版本的redis
docker pull redis:5.0 #下载5.0版本的redis
删除镜像:删除本地镜像
docker rmi 镜像id #删除指定本地镜像
docker images -q #查看所有镜像列表
docker rmi `docker images -q` #删除所有本地镜像
2.3容器相关命令
查看容器
docker ps #查看正在运行的容器
docker ps -a #查看所有容器
docker ps -as #查看所有容器及大小
创建并启动容器
docker run 参数
参数说明:
* -i:保持容器运行。通常与-t同时使用。加入it这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭
* -t:为容器重新分配一个伪输入终端,通常与-i同时使用
* -d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec进入容器。退出后,容器不会关闭。
* -it创建的容器一般称为交互式容器,-id创建的容器一般称为守护式容器
* --name:为创建的容器命名
docker run -it --name=d1 centos:7 /bin/bash #创建交互式容器
docker run -id --name=d2 centos:7 #创建守护式容器
注意:交互式容器,exit后容器自动关闭,守护式容器会在后台执行
进入容器
docker exec -it 容器名称 /bin/bash
docker exec -it d2 /bin/bash
停止容器
docker stop 容器名称
启动容器
docker start 容器名称
删除容器:容器停止运行后才能删除
docker rm 容器名称
查看容器信息
docker inspect 容器名称
三、Docker容器的数据卷
3.1数据卷的概念、作用
由于Docker容器删除后,容器数据也会随之被删除,而且Docker容器也不能直接跟外部机器直接交换文件,所以就有了数据卷
数据卷的概念
- 数据卷是宿主机的一个目录或文件
- 当容器目录和数据卷目录绑定后,对方的修改会立即同步
- 一个数据卷可以被多个容器同时挂载
- 一个容器也可以被挂载多个数据卷
数据卷的作用 - 容器数据持久化
- 外部机器和容器间的通信
- 容器之间的数据交换
3.2配置数据卷
创建启动容器时,使用-v 参数设置数据卷
docker run ... -v 宿主机目录(文件):容器内目录(文件)
注意事项:
- 容器目录必须是绝对路径
- 如果目录不存在,会自动创建
- 可以挂载多个数据卷
例:
创建d1挂载/root/data到/root/data_container
docker run -it --name=d1 -v /root/data:/root/data_container centos:7 /bin/bash
在容器内绑定数据卷的目录创建文件
[root@c51b0f30b587 /]# cd /root/data_container/
[root@c51b0f30b587 data_container]# echo "my text" > a.txt
[root@c51b0f30b587 data_container]# ll
total 4
-rw-r--r--. 1 root root 8 Jan 3 15:30 a.txt
[root@c51b0f30b587 data_container]# cat a.txt
my text
[root@c51b0f30b587 data_container]#
exit退出容器,可以看到数据卷文件还在
[root@c51b0f30b587 data_container]# exit
exit
[root@kkb ~]# cd /root/data/
[root@kkb data]# ll
total 4
-rw-r--r--. 1 root root 8 Jan 3 21:00 a.txt
[root@kkb data]# cat a.txt
my text
删除d1容器,数据卷数据依然存在
[root@kkb data]# docker rm d1
d1
[root@kkb data]# ll
total 4
-rw-r--r--. 1 root root 8 Jan 3 21:00 a.txt
[root@kkb data]# cat a.txt
my text
重新恢复d1,/root/data_container目录数据恢复
[root@kkb data]# docker run -it --name=d1 -v /root/data:/root/data_container centos:7 /bin/bash
[root@e705370dfcb6 /]# cd /root/data_container/
[root@e705370dfcb6 data_container]# ll
total 4
-rw-r--r--. 1 root root 8 Jan 3 15:30 a.txt
[root@e705370dfcb6 data_container]# cat a.txt
my text
3.3配置数据卷容器
多容器进行数据交换,多个容器挂载同一个数据卷容器,完成数据交互
- 创建启动d3数据卷容器,使用-v参数,设置数据卷
docker run -it --name=d3 -v /volume centos:7 /bin/bash
[root@data]# docker run -it --name=d3 -v /volume centos:7 /bin/bash
[root@b252960547bd /]
这里没有指定宿主目录,默认生成一个宿主机目录
新开一个连接,可以查看d3的信息
docker inspect d3
- 创建启动d4 、d5容器,使用–volumes-from参数,设置数据卷
docker run -it --name=d4 --volumes-from d3 centos:7 /bin/bash
docker run -it --name=d5 --volumes-from d3 centos:7 /bin/bash
查看开启的容器
[root@kaikeba ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4fa7c223fd3d centos:7 "/bin/bash" 21 seconds ago Up 17 seconds d5
9ec2191b444b centos:7 "/bin/bash" 7 minutes ago Up 7 minutes d4
b252960547bd centos:7 "/bin/bash" 20 minutes ago Up 20 minutes d3
[root@kaikeba ~]#
使用 c3数据卷容器创建c1,c2,这时即使c3关闭不影响c3,c4交互
数据卷小结
- 数据卷概念
宿主机的一个目录或文件 - 数据卷作用
容器数据持久化
客户端和容器数据交换
容器间数据交换 - 数据卷容器
创建一个容器,挂载一个目录,让其他容器继承自该容器( --volume-from )。
通过简单方式实现数据卷配置
四、Docker应用部署
4.1MySql
分析
- 容器内的网络服务和外部机器不能直接通信
- 外部机器和宿主机可以直接通信
- 宿主机和容器可以直接通信
- 当容器中的网络服务需要被外部机器访问时,可以将容器中提供服务的端口* 映射到宿主机的端口上。外部机器访问宿主机的端口,从而间接访问容器的服务。
- 这种操作称为:端口映射
- 搜索mysql镜像
docker search mysql
- 拉取镜像
docker pull mysql:5.6
- 创建容器,设置端口映射、目录映射
#在/root目录下创建mysql目录用于存储mysql数据信息
mkdir /root/mysql
cd /root/mysql
docker run -id -p 3307:3306 --name=d_mysql \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 mysql:5.6
参数说明:
* -p 3307:3306:将容器的3306端口映射到宿主机的3307端口
* -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的conf/my.cnf挂载到容器的/etc/mysql//my.cnf。配置目录
* -v $PWD/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。日志目录
* -v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。数据目录
* -e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。
- 进入容器,操作mysql
docker exec -it c_mysql /bin/bash
mysql -uroot -p123456
show databases;
create database db1;
- 使用外部机器连接容器中的mysql
4.2Tomcat
- 搜索tomcat镜像
docker search tomcat
- 拉取tomcat镜像
docker pull tomcat
- 创建容器,设置端口映射、目录映射
# 在/root目录下创建tomcat目录用于存储tomcat数据信息
mkdir ~/tomcat
cd ~/tomcat
docker run -id --name=c_tomcat \
-p 8080:8080 \
-v $PWD:/usr/local/tomcat/webapps \
tomcat
参数说明:
* -p 8080:8080:将容器的8080端口映射到主机的8080端口
* -v $PWD:/usr/local/tomcat/webapps:将主机中当前目录挂载到容器的webapps
- 使用外部机器访问tomcat
4.3.Nginx
- 搜索redis镜像
docker search redis
- 拉取redis镜像
docker pull redis:5.0
- 创建容器,设置端口映射
docker run -id --name=c_redis -p 6379:6379 redis:5.0
- 使用外部机器连接redis
./redis-cli.exe -h 192.168.220.12 -p 6379
keys *
set name lxs
get name