Docker基础
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker架构
Docker 包括三个基本概念:
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。
Docker的应用场景
-
Web 应用的自动化打包和发布。
-
自动化测试和持续集成、发布。
-
在服务型环境中部署和调整数据库或其他的后台应用。
-
从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
在linux虚拟机上安装docker
1、检查内核版本,必须是3.10及以上
uname ‐r
2、安装docker
yum install docker
3、输入y确认安装
4、启动docker
[root@localhost ~]# systemctl start docker
[root@localhost ~]# docker ‐v
Docker version 1.12.6, build 3e8e77d/1.12.6
5、开机启动docker
[root@localhost ~]# systemctl enable docker
Created symlink from /etc/systemd/system/multi‐user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
6、停止docker systemctl stop docker
镜像操作
/usr/bin/docker build -f Dockerfile -t 镜像名 .
/usr/bin/docker push 镜像名
容器操作
搜索镜像
[root@localhost ~]# docker search tomcat
拉取镜像
[root@localhost ~]# docker pull tomcat
复制镜像(更改镜像名)
docker tag IMAGE ID(要复制的原镜像的ID) REPOSITORY:TAG(复制后的镜像的REPOSITORY和TAG)
删除镜像
docker rmi IMAGE ID # 根据镜像ID删除镜像
docker rmi REPOSITORY:TAG # 当复制镜像的时候,复制后的镜像的ID和原镜像的ID一样,docker rmi IMAGE ID这个指令就无法删除镜像了,这时候就要用docker rmi REPOSITORY:TAG来删除镜像了。
根据镜像ID启动容器
docker run IMAGE ID
导出镜像
docker save -o nginx.tar nginx:latest
docker save > nginx.tar nginx:latest
其中-o和>表示输出到文件,nginx.tar为目标文件,nginx:latest是源镜像名(name:tag)
导出的镜像在虚拟机执行命令所在的目录
导入镜像
docker load -i nginx.tar
docker load < nginx.tar
其中-i和<表示从文件输入。会成功导入镜像及相关元数据,包括tag信息
查看运行中的容器
docker ps
停止运行中的容器
docker stop 容器的id
查看所有的容器
docker ps ‐a
启动容器
docker start 容器id
删除容器
docker rm 容器id
docker run [--name 容器名] [--rm] [-it] [-d] [-p 宿主机端口:容器端口 ] 镜像名:标签 [容器启动命令]
--name 指定容器名
--rm 执行后删除
-it 进入容器进行交互
-d 保存后台运行不退处
-P 随机端口映射,从32768开始
-p 宿主机端口:容器端口 指定端口映射
-e MYSQL_ROOT_PASSWORD=123456 初始化root用户的密码
-d 表示使用守护进程运行,即服务挂载后台运行
-v 使用主机目录和容器目录映射来完成数据的持久化
启动容器
docker run -it --network=host -d 300e315adb2f /bin/bash
进入容器
docker exec -it 6959c31403d3 /bin/bash
主机和容器之间复制文件和目录
docker cp 6959c31403d3:usr/lib/test.txt /root/test/
docker cp /root/test/test.txt 6959c31403d3:usr/lib/
Linux之间复制文件和目录
scp -P22 linux_0.1.zip root@127.0.0.1:/root/test
启动Centos容器时更正时区,开启SSH
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime&&/usr/sbin/sshd -D
为了演示简单关闭了linux的防火墙
service firewalld status ;查看防火墙状态
service firewalld stop:关闭防火墙
查看容器的日志
docker logs container‐name/container‐id
docker mysql
--普通启动mysql
docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
docker ps
docker exec -it 6959c31403d3 /bin/bash
mysql -u root -p
show databases;
select host, user, authentication_string, plugin from user;
CREATE DATABASE IF NOT EXISTS `test` DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
USE `test`;
CREATE TABLE IF NOT EXISTS `users` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`username` VARCHAR(50) NOT NULL,
`email` VARCHAR(100) NOT NULL,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--挂载数据卷启动mysql
--启动demo mysql,以复制配置文件
docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 ae0658fdbad5
--本地创建数据卷路径
mkdir -p /root/mysql/data /root/mysql/logs /root/mysql/conf
docker cp 4f08a9d1fcd3:/etc/mysql/. /root/mysql/conf
--初始化mysql配置文件 *.cnf
touch /root/mysql/conf/my.cnf
--删除demo mysql容器
docker stop a97562ff9f12
docker rm a97562ff9f12
--启动mysql
docker run -d --name mysql -p 3306:3306 \
-v /root/mysql/conf:/etc/mysql/conf.d \
-v /root/mysql/logs:/var/log/mysql \
-v /root/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--privileged=true \
ae0658fdbad5
--验证配置是否成功
docker stop a97562ff9f59
docker restart a97562ff9f59
docker redis
docker run --name redis -p 6379:6379 -d 74d107221092 redis-server --appendonly yes --requirepass 123456
--name redis:指定容器的名称为redis。
-p 6379:6379:将宿主机的6379端口映射到容器的6379端口。
-d:在后台运行容器。
74d107221092:指定要运行的Docker镜像。
redis-server --appendonly yes --requirepass 123456:这些是传递给Redis服务器的命令行参数,用于启用AOF持久化并设置密码。
docker RabbitMQ
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin 263c941f71ea
5672是RabbitMQ的AMQP端口,用于应用程序与RabbitMQ之间的通信;15672是RabbitMQ的管理插件端口,用于Web管理界面。
RabbitMQ的管理界面默认运行在容器的15672端口上,由于已将这个端口映射到了宿主机的15672端口,所以可以直接在浏览器中输入http://<宿主机IP>:15672来访问管理界面。使用之前设置的用户名(默认为admin)和密码(默认为admin)登录即可。
docker tomcat
启动一个做了端口映射的tomcat
docker run ‐d ‐p 8888:8080 tomcat
‐d:后台运行
‐p: 将主机的端口映射到容器的一个端口 主机端口:容器内部的端口
参考文章:
Docker 架构 | 菜鸟教程