Docker
初识Docker
Docker:是一个开源的应用容器引擎。Go语言实现,诞生于2013年。
容器是完全使用沙箱机制,相互隔离。
Docker是一种容器技术,解决软件环境迁移问题。
安装Docker
yum包更新到最新
sudo yum update
安装需要的软件包
yum install -y yum-utils device-mapper-persistent-data lvm2
设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
安装docker
yum install -y docker-ce
查看docker版本
docker -v
Docker架构
- 镜像(Image):Docker镜像(Image),相当于是一个root文件系统。比如官方镜像ubuntu:16.04就包含了一套ubuntu16.04最小系统的root文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中类和对象的关系,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看成是一个代码控制中心,用来保存镜像。
配置镜像加速器
默认docker镜像比较慢需要更换成国内的。 阿里云自带
Docker命令
后台守护进程命令
- 启动docker:
systemctl start docker
- 查看状态:
systemctl status docker
- 停止docker:
systemctl stop docker
- 重启docker:
systemctl restart docker
- 开机启动docker:
systemctl enable docker
Docker镜像相关命令
ducker hub网站查看docker镜像版本
- 查看镜像:
docker images
- 查看镜像id:
docker images -q
REPOSITORY TAG(版本) IMAGE ID(镜像ID) CREATED(创建时间) SIZE(镜像大小) - 搜索镜像:
docker search redis
official【ok】表示官方维护的镜像 - 拉取镜像:
docker pull redis
默认下载latest版本,否则可以docker pull redis:5.0
- 删除镜像:
docker rmi redis:TAG
- 删除所有镜像:
docker rmi
docker images -q``
容器相关命令
- 查看容器:
- 创建容器:
docker run -it --name=c1 centos:7 /bin/bash
-i一直运行t马上给个终端
--name=c1起个名字叫c1
centos:7根据哪个镜像
/bin/bash初始化指令
- 退出容器:
exit
- 查看正在运行的容器:
docker ps
- 查看历史容器:
docker ps -a
root@iZ2ze5kq3112w20bes3g08Z:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1218db9cba86 centos:7 "/bin/bash" 3 minutes ago Exited (0) About a minute ago c1
- 后台运行:
docker run -id --name=c2 centos:7;docker exec -it c2 /bin/bash
root@iZ2ze5kq3112w20bes3g08Z:~# docker run -id --name=c2 centos:7
4b7be99c2f12c9a966a43d0b2fd9b19d6acb881c1f299db3408d75ae40dc6cd3
root@iZ2ze5kq3112w20bes3g08Z:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4b7be99c2f12 centos:7 "/bin/bash" 7 seconds ago Up 6 seconds c2
1218db9cba86 centos:7 "/bin/bash" 6 minutes ago Exited (0) 5 minutes ago c1
root@iZ2ze5kq3112w20bes3g08Z:~# docker exec -it c2 /bin/bash
- 停止容器:
docker stop c2
- 开启容器:
docker start c2;docker exec -it c2 /bin/bash
- 删除容器:
docker rm c2
不能删掉正在运行的容器 - 查看容器信息:
docker inspect c2
docker的数据卷
数据卷概念
-
Docker容器删除后,在容器中产生的数据还在么?不
-
Docker容器和外部机器可以直接交换文件么?不
-
容器之间想要进行数据交互?数据卷
-
数据卷 数据卷是宿主机中的一个目录或文件
当容器目录和数据卷目录绑定之后,对方的修改会立即同步。
一个数据卷可以被多个容器同时挂载
一个容器也可以被挂载多个数据卷
数据卷就是为了解决:
- 容器数据持久化
- 外部机器和容器间接通信
- 容器间数据交换
配置数据卷
- 创建启动容器的时候,使用-v参数设置数据卷
docker run ... -v 宿主机目录(文件):容器内目录(文件) ...
docker run -it --name=centos1 -v /root/data:/root/data_container centos:7 /bin/bash
这两个目录就会同步
- 目录必须是绝对路径
- 如果幕布不存在就会自动创建
- 可以挂载多个数据卷
docker run -it --name=centos2 -v ~/data:/root/data centos:7
Ⅰ宿主机/root/dataⅡ容器centos1/root/data_containerⅢ容器centos2/root/data三者同步
数据卷容器
多容器进行数据交换
配置数据卷容器
- 创建
docker run -it --name=c3 -v /volume centos:7
创建并挂载到c3上
docker run -it --name=c2 --volumes-from c3 centos:7
docker run -it --name=c1 --volumes-from c3 centos:7
此时c1、c2、c3的/root/volume相通,c3是数据卷
Docker应用部署
MySQL部署
在Docker中部署MySQL
- 搜索mysql镜像
- 拉取mysql镜像
- 创建容器
- 操作容器中的mysql
- 搜索并拉取容器
docker search mysql
docker pull mysql:5.6
- 创建容器,设置端口映射、目录映射
mkdir ~/mysql
cd ~/mysql
docker run -id \
-p 3306:3306 \
--name=c_mysql \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=532101 \
mysql:5.6
- 进入镜像
docker exec -it c_mysql /bin/bash
- 进入mysql
mysql -uroot -p
Tomcat部署
dcoker 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部署
docker pull nginx
mkdir ~/nginx
cd ~/nginx
mkdir conf
cd conf
vim 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部署
docker
docker search redis
docker pull redis:5.0
docker run -id --name=c_redis -p 6379:6379 redis:5.0
修改redis配置文件
redis.conf下载连接:http://download.redis.io/redis-stable/redis.conf?spm=a2c6h.12873639.article-detail.6.643e3c09qsXuxB&file=redis.conf
宿主机存放目录:/etc/redis.conf
修改:bind 127.0.0.1
注释掉或者是将后面的ip改成0.0.0.0。这样表示所有的ip都能访问该redis服务,否则只有本机可以访问。第二处,将protected-mode
的值改成no,默认为yes.
检查防火墙是否开放端口
firewall-cmd --query-port=6379/tcp
firewall-cmd --zone=public --add-port=6379/tcp --permanent
firewall-cmd --reload
检查阿里云安全组是否开启了6339端口
外部机连接
D:\redis>redis-cli.exe -h 60.205.149.67 -p 6379
Dockerfile
Docker镜像原理
- Docker镜像本质是什么 分层的文件系统
- 为什么centos镜像比ios文件小这么多 centos的ios镜像文件包含bootfs和rootfs,而docker的centos镜像服用操作系统的bootfs,只有rootfs和其他镜像层
- 为什么tomcat镜像很大,安装包却很小 docker中一个tomcat
镜像制作
该镜像能够在docker ps中找到
docker commit 17746 redis_l:1.0
该镜像就会存在于images
打包成.tar
docker save -o redis_l.tar redis_l:1.0
还原镜像
docker load -i redis_l.tar
//运行
docker run -it --name=new_redis redis_l:1.0 bash
dockerfile
可以查找dockerhub
- form指定父镜像
- run执行命令
- cmd容器启动命令 自定义一个centos的镜像
要求:1.默认登陆路径/usr2.可以用vim
定义父镜像
FROM centos:7
定义作者信息:
MAINTAINER itheima<itheima@itcast.cn>
执行安装vim的命令
run yum install -y vim
设置工作路径
WORKDIR /usr
定义容器启动执行命令
CMD /bin/bash
FROM centos:7
MAINTAINER zhouda<zhouda1998@qq.com>
RUN yum install -y vim
WORKDIR /usr
cmd /bin/bash
执行
docker build -f ./centos_dockerfile -t docker_centos:1 .
docker run -it --name=c_centos docker_centos:1
springboot项目
服务编排
docker compose
docker私有仓库
搭建私有仓库