基础篇
一、什么是docker
解决了运行环境和配置问题的软件容器。方便做持续集成并有助于整体发布的容器虚拟技术。
一次构建,随处运行。
官网:docker官网:http://www.docker.com
仓库 Docker Hub官网:https://hub.docker.com
CentOS 7 仅发行版本中的内核支持Docker。Docker运行在CentOS 7 上,系统要求64位,Linux系统内核3.8以上。
cat /etc/redhat- release 或 uname -r 查看系统相关信息 或 内核版本
Docker 三件套 镜像(image)、容器(container)、仓库(repository)
Docker本身是一个容器运行载体或称之为管理引擎。
一个镜像可以创建很多个容器。应用程序和配置环境打包形成一个可交付的运行环境即镜像。
容器类似于一个虚拟化的运行环境,是用镜像创建的运行实例。容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。容器可以看做是一个简易版的Linux环境。一个容器运行一种服务。
仓库(repository)是集中存在镜像文件的场所。Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模板的地方。
二、Centos Docker安装
https://docs.docker.com/engine/install/centos/
1、卸载旧版本
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2、安装gcc相关
yum -y install gcc
yum -y install gcc-c++
安装软件包(提供实用程序)并设置存储库。yum-utils yum-config-manager
$ sudo yum install -y yum-utils
$ yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3、更新yum软件包索引
yum makecache fast
4、安装 Docker
sudo yum install docker-ce docker-ce-cli containerd.io
5、启动 Docker,查看版本
sudo systemctl start docker
docker version
验证是否安装成功
sudo docker run hello-world
6、卸载
sudo systemctl start docker
sudo yum remove docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
7、配置阿里云镜像加速
用个人阿里云账号登录,找到弹性计算——容器镜像服务——实例列表——镜像工具——镜像加速器,出现加速器地址,按照上面的方法配置。
8、在ubuntu上安装docker
sudo apt-get update
sudo apt-get upgrade
sudo apt-get -y insatll gcc
sudo apt-get -y install build-essential
# 安装系统工具
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# 安装gpg证书
sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add -
# 安装docker
# sudo apt-get install docker-ce docker-ce-cli containerd.io
# 使用官方安装脚本自动安装 , 安装命令如下:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
# 也可以使用国内 daocloud 一键安装命令:
curl -sSL https://get.daocloud.io/docker | sh
# 在ubuntu上启动docker
service docker start # (这里把我坑惨了,启动不起老找不到原因)
# 在Centos上启动
# systemctl start docker
9、在 docker上使用mysql镜像
docker pull mysql
docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql
# docker run -p 3306:3306 --name qmm-mysql -v ~/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=669988 -d mysql:5.6
# 创建容器时,最后mysql:5.6表示mysql镜像的版本,可以写,表示指定该版本;
# 如果不写也可以,docker会自动在本地检测有没有最新的,如果没有会自动去docker hub上去下载。
三、docker常用命令
1、帮助启动类命令
启动docker :systemctl start docker (ubuntu)
service docker start (centos 7)
停止docker:systemctl stop docker
重启docker:systemctl restart docker
查看docker状态:systemctl status docker
开机启动:systemctl enable docker
查看docker概要信息:docker info
查看docker总体帮助文档:docker --help
查看docker命令帮助文档:docker 具体命令 --help
2、镜像命令
1、docker images 列出本地的镜像 -a 列出本地所有镜像(含历史映像层) -q 只显示镜像ID
格式:仓库源 标签版本号 镜像ID 创建时间 大小
2、docker search 镜像名 搜索镜像 --limit 只列出N个镜像,默认25个
例如:docker search --limit 5 redis
3、docker pull 镜像名字[:TAG] 没有TAG就是最新版
4、docker system df 查看镜像、容器、数据卷所占的空间。
5、docker rmi 镜像ID -f 强制删除
docker rmi -f 镜像ID # 删除单个
docker rmi -f 镜像名1:TAG 镜像名2:TAG # 删除多个
docker rmi -f $(docker images -qa) # 删除全部
3、容器相关的命令
创建交互式终端容器
docker run -it ubuntu /bin/bash
-i # 交互式操作
-t # 终端
ubuntu # 镜像
/bin/bash # 放在镜像名后的命令,用/bin/bash 交互
docker run -it --name=myu1 ubuntu bash
--name # 指定name,不指定系统分配
bash # 和 /bin/bash 一样
-d # 后台运行并返回容器ID,即启动守护式容器后台运行
-p(小写) # 指定要映射的IP和端口,但是在一个指定端口上只可以绑定一个容器
# 支持的格式有 hostPort:containerPort、ip:hostPort:containerPort、 ip::containerPort
-P(大写) # Docker会随机映射一个 49000~49900 的端口到内部容器开放的网络端口
列出当前所有在运行的容器
docker ps
-a # 列出当前所有正在运行的容器 + 历史运行过的
-l # 显示最近创建的容器
-n # 显示最近n个创建的容器
-q # 静默模式,只显示容器编号
退出容器
两种方式
exit # run进去容器,exit退出,容器停止
ctrl+p+q # run进去容器,退出容器不停止
启动、停止、重启、删除 容器
# 启动已停止运行的容器
docker start 容器ID 或 容器名
# 重启容器
docker restart 容器ID 或 容器名
# 停止容器
docker stop 容器ID 或 容器名
# 强制停止容器
docker kill 容器ID 或 容器名
# 删除容器,先停止再删除,没有停止的 -f 强制删除
docker rm 容器ID 或 容器名
# 一次性删除多个容器实例
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm
4、重要
1、启动守护式容器(后台服务)
docker容器后台运行必须有一个前台进程,否则会立即自杀(docker run redis)
# 后台守护式启动
docker run -d redis
# 前台交互式启动, bash 可省略
docker run -it redis
2、查看容器日志
docker logs 容器ID
3、使用 docker run -it ubuntu /bin/bash 进入后,ctrl+p+q 退出后,
docker exec -it 容器id /bin/bash 再次进入交互,退出交互使用exit,不会导致容器退出
docker attach 容器ID,再次进入交互,不会启动新的进程,用exit退出,会导致容器的停止。
推荐使用 docter exec -it 容器ID 命令。
4、查看容器运行的情况 docker ps
5、查看容器内部后台情况 docker top 容器ID
6、查看容器内部细节 docker inspect 容器ID
7、从容器内拷贝文件到主机上
docker cp 容器ID:容器内路径 目的主机路径
8、导入和导出容器
docker export 容器ID > 文件名.tar
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
四、Docker镜像
1、docker commit
# 先进入容器,然后下载vim
apt-get update
apt-get -y install vim
# 提交镜像
docker commit -m='描述' -a='提交人' 镜像ID 要创建的目标镜像名:[标签名]
2、本地镜像发布到阿里云
3、搭建私有镜像仓库
1、下载镜像Docker Registry (docker pull registry)
2、运行私有库Registry,相当于在本地有个私有Docker hub
docker run -d -p 5000:5000 -v /zzyyuse/myregistry:/var/lib/registry --privileged=true registry
# -d 后台运行
# -p 指定映射端口
# 仓库被创建在容器的 /var/lib/registry 目录下
# privileged=true 开启权限
# -v 添加自定义的容器卷
# : 号 左边是宿主机的路径,右边是容器内的路径
3、创建一个镜像
docker pull ubuntu # 拉一个原始镜像
docker run -if ubuntu /bin/bash # 进入镜像
apt-get update
apt-get -y install net-tools # 安装ifconfig命令
docker commit -m='描述' -a='提交人' 镜像ID 要创建的目标镜像名:[标签名] # 提交
4、查询私有仓库上有什么镜像
curl - XGET http://192.168.111.167:5000/v2/_catalog # IP为自己主机的IP
5、将新镜像修改符合私有仓库规范的TAG
docker tag 名字:TAG 192.168.111.167:5000/名字:TAG
6、修改配置文件使之支持http
cat /etc/docker/daemon.json
# 这个文件之前配置阿里云加速器的时候已经配置过
# 再加上一句 "insecure-registries":["192.168.111.167:5000"]
# 修改之后需要重启docker,最新版本的docker不需要重启
systemctl restart docker
systemctl status docker
# 然后再启动私有仓库
docker run -d -p 5000:5000 -v /zzyyuse/myregistry:/var/lib/registry --privileged=true registry
7、push推送镜像到私有仓库
docker push 192.168.111.167:5000/名字:TAG
8、验证是否push成功
curl - XGET http://192.168.111.167:5000/v2/_catalog
9、pull到本地运行
docker pull 192.168.111.167:5000/名字:TAG
五、容器数据卷
将docker容器内的数据保存进宿主机的磁盘中。
特点:
- 数据卷可在容器之间共享或重用数据
- 卷中的更改可以直接实时生效,爽
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
运行一个带有容器卷功能的容器实例
docker run -it --privileged=true -v /宿主机绝对路径:/容器内目录 --name 容器名 镜像名
docker run -it --privileged=true -v /宿主机绝对路径:/容器内目录:ro 镜像名 # ro 代表容器内只读权限 rw 读写权限
-v 后的宿主机路径 和 容器内目录 可以共享数据
# --volumes-from u1, 继承u1, u1 是 --name 后起的名字,u2 继承 u1 u2 和 u1 可以共享数据,映像到宿主机的路径相同
docker run -it --privileged=true --volumes-from u1 --uname u2 ubuntu
六、docker下常规软件的安装
1、安装tomcat
docker search tomcat
docker pull tomcat
docker images tomcat
docker run -it -p 8080:8080 --name t1 tomcat
# 这样下载到的tomcat是最新版的,使用 http://localhost:8080 访问不到,需要删除docker下的webapps,把webapps.dist 改名为webapps
#可是拉取下面的tomcat镜像,安装后可直接访问
docker pull billygoo/tomcat8-jdk8
2、安装mysql
docker pull mysql:5.7
docker images mysql:5.7
# some-mysql 名字 my-secret-pw root密码 tag 标签(版本号)
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
# 不实用,原因,没有数据卷,容器被删除,数据也被删除
# 存在中文乱码问题
docker run -d -p 3306:3306 --privileged=true
-v /zzyyuse/mysql/log:/var/log/mysql
-v /zzyyuse/mysql/data:/var/lib/mysql
-v /zzyyuse/mysql/conf:/etc/mysql/conf.d
-e MYSQL_ROOT_PASSWORD=123456
--name mysql
mysql:5.7
# 解决乱码问题,在 /zzyyuse/mysql/conf 路径下 vim my.cnf
[client]
default_character_set=utf8
[mysqld]
character_set_server=utf8
collation_server=utf8_general_ci
# 修改完以后重启 docker
docker restart mysql
3、docker 安装redis
docker pull redis:6.0.8
docker run -d -p 6379:6379 redis:6.0.8
mkdir -p /app/redis
# 从之前安装过的redis中拷贝一个redis.conf过来
cp /myredis/redis.conf /app/redis/
# 允许redis外地连接,注释 # bind 127.0.0.1
# 注释 # daemonize yes 或者 修改为 daemonize no
# 开启redis数据持久化 appendonly yes
protected-mode no
docker run -p 6379:6379 --name myr3 --privileged=true
-v /app/redis/redis.conf:/etc/redis/redis.conf
-v /app/redis/data:/data
-d redis:6.0.8
redis-server /etc/redis/redis.conf
# 测试连接
docker exec -it myr3 /bin/bash
redis-cli
set k1 v1
get k1
select 15 # 15 是 databases 配置的 数字
# 通过修改databases的数量 可验证是否使用的是我们配置的redis.conf
高级篇
一、docker复杂安装
1、新建主服务器容器实例 3307
# 新建主服务器
docker run -d -p 3307:3306 --name mysql-master
-v /mydata/mysql-master/log:/var/log/mysql
-v /mydata/mysql-master/data:/var/lib/mysql
-v /mydata/mysql-master/conf:/etc/mysql
-e MYSQL_ROOT_PASSWORD=root
-d mysql:5.7
在 /mydata/mysql-master/conf 目录下 vim my.conf
[mysqld]
server_id=101 # 同一局域网中需要唯一
binlog-ignore-db=mysql # 指定不需要同步的数据库名称
log-bin=mall-mysql-bin # 开启二进制日志功能
binlog_cache_size=1M # 二进制日志使用内存大小(事务)
binlog_format=mixed # 二进制日志格式
# 二进制日志文件保存的过期时间,默认0,不自动清理
expire_logs_days=5
#作为从库时生效,主从复制时忽略的错误,1062主键重复,1032主从数据库不一致
slave_skip_errors = 1062
#作为从库时生效,主从复制时忽略的错误
#slave_skip_errors = ddl_exist_errors
docker restart mysql-master # 重启
docker exec -it mysql-master /bin/bash
mysql -u root -p
show databases;
# 创建数据库同步用户
CREATE USER 'slave'@'%' IDENTIFIED BY '123456'
# 给用户授权
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'slave'@'%'
# 新建从服务器
docker run -d -p 3308:3306 --name mysql-slave
-v /mydata/mysql-slave/log:/var/log/mysql
-v /mydata/mysql-slave/data:/var/lib/mysql
-v /mydata/mysql-slave/conf:/etc/mysql
-e MYSQL_ROOT_PASSWORD=root
-d mysql:5.7
# 在 /mydata/mysql-slvae/conf 目录下 vim my.conf
[mysqld]
server_id=102 # 同一局域网中需要唯一
binlog-ignore-db=mysql # 指定不需要同步的数据库名称
# 开启二进制日志功能,以备slave作为其他数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin
binlog_cache_size=1M # 二进制日志使用内存大小(事务)
binlog_format=mixed # 二进制日志格式
# 二进制日志文件保存的过期时间,默认0,不自动清理
expire_logs_days=5
#作为从库时生效,主从复制时忽略的错误,1062主键重复,1032主从数据库不一致
slave_skip_errors = 1062
#作为从库时生效,主从复制时忽略的错误
#slave_skip_errors = ddl_exist_errors
# relay_log 配置中继日志
relay_log=mall-mysql-relay-bin
# slave将复制事件写进自己的二进制日志
log_slave_updates=1
# slave设置为只读(具有super权限的用户除外)
read_only=1
docker restart mysql-slave # 重启
标签:实战,容器,教程,--,redis,mysql,镜像,docker
From: https://blog.51cto.com/feng150702/6442088