一、简介
docker解决了,运行环境和配置问题的软件容器
和虚拟机的对比:
1、资源占用多
2、冗余步骤多
3、启动慢
二、安装
1、条件:Linux内核3.8以上
2、基本组成三要素:镜像,容器,仓库
3、安装步骤:推荐根据官网步骤安装,可以选择ubuntu,centOS等
Install Docker Engine on Ubuntu | Docker Documentation
三、基本命令
想知道某个命令的具体用法: docker 命令关键字 --help
eg docker images --help
Usage: docker images [OPTIONS] [REPOSITORY[:TAG]]
List images
Options:
-a, --all Show all images (default hides intermediate images)
--digests Show digests
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print images using a Go template
--no-trunc Don't truncate output
-q, --quiet Only show image IDs
1、docker images :列出docker所有镜像
2、docker search 镜像名称 :查询某个镜像
3、docker pull 镜像名称:拉取某个镜像
4、docker system df :查看镜像容器所占空间大小
5、docker rmi 镜像名称 删除镜像
-f 镜像ID 根据镜像ID删除镜像
-f $(docker images -qa) 删除所有镜像
6、创建容器
a. 交互式:docker run --name=容器名称 -it 镜像名称/镜像ID /bin/bash
docker run -it ubuntu --name=mydocker /bin/bash
-i 交互式操作
-t 终端
ubuntu ubuntu镜像
--name=mydocker 设置容器名称
/bin/bash 放到镜像后的命令是我们启动镜像容器后使用的shell
b. 守护式:docker run -d 镜像名称:创建以后后台守护进程的容器
注意:只能是镜像名称,镜像ID不好使,后面不能跟 /bin/bash
7、docker ps -q 列出当前正在运行的容器
-a 运行过的所有容器
8、退出&进入容器
a. 退出容器,容器停止:exit
b. 退出容器,容器不停止:ctr+p+q
重新进入退出的容器 docker exec/attach -it 容器ID /bin/bash
** exec和attach的区别:
9、容器的重启/停止/启动 docker restart/stop/start 容器ID/容器名称
强制停止容器 docker kill 容器ID/容器名称
删除容器 docker rm 容器ID
一次性删除多个容器实例 docker rm -f $(docker ps -qa) / docker ps -qa | xargs docker rm
-f 强制删除
10、查看日志 docker logs 容器ID
11、查看容器内运行的进程 docker top 容器ID
12、查看容器内部细节 docker inspect 容器id
13、备份
从容器复制文件到主机:docker cp 容器ID:容器内路径 目的主机路径
eg docker cp 2ff4b68b344c:/data/a.html ~
把容器整体备份到本地:docker export 容器ID > 本机路径
eg docker export 2ff4b68b344c > ~/redis.tar
把本地备份的容器导入成镜像:cat 本地文件路径 | docker import - 镜像用户/镜像名:版本号
eg cat redis.tar | docker import - test/redis:5.0
导入成镜像后可以再创建容器就可以恢复了
虚悬镜像:仓库名、标签名都是none的镜像
14、容器间文件复制
docker cp 容器ID:容器目录地址 当前机器地址
docker cp 当前机器地址 容器ID:容器目录地址
四、docker commit
给容器安装需要的软件或者对容器的一切修改,经过commit命令会生成新的镜像,此时的镜像再次被创建为容器的时候会携带之前安装的软件或者修改内容,这就是重新自作镜像的过程。也是docker的分层原理。
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名称:标签
eg docker run --name=myrediss -it 45b0df3b4929 /bin/bash
五、镜像push到阿里云
先把远程库设置为阿里云,下面链接有具体设置流程
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
设置完之后还是在上面那个页面里找到实例列表-》个人实例,然后创建命名空间和镜像仓库,记着选着本地仓库按钮创建
然后可以通过阿里云提供的命令把自己的镜像推送到阿里云了,记着吧ImageId和镜像版本号替换成自己的哦。
六、搭建个人私服Docker仓库
首先拉下来镜像 registry:docker pull registry
1、运行docker:docker run -d -p 5000:5000 -v /tmp/myregistry/:/tmp/myregistry registry
-p 主机端口:容器端口
2、查询私服仓库镜像:curl -XGET http://192.168.186.129:5000/v2/_catalog
主机IP:192.168.186.129
端口:5000 第1步映射的端口
/v2/_catalog:固定格式
3、把容器打包成固定格式:
docker tag 容器名称:版本号 主机ip:映射端口/打包后的镜像名称:版本号
eg docker tag test/redis:5.0 192.168.186.129:5000/myredis:5.0
4、设置docker白名单 vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://mcs65aer.mirror.aliyuncs.com"],
"insecure-registries":["192.168.186.129:5000"]
}
insecure-registries行是新增的白名单,
重启docker: service docker restart
5、把容器推送到私服仓库 docker push 本机ip:映射端口/镜像名称:版本号
eg docker push 192.168.186.129:5000/myredis:5.0
推送完查看 curl -XGET http://192.168.186.129:5000/v2/_catalog
{"repositories":["myredis"]}
6、把镜像拉到本地 docker pull 本机ip:映射端口/镜像名称:版本号
docker pull 192.168.186.129:5000/myredis:5.0
七、容器数据卷
将docker内的数据保存到宿主机目录下,保证数据的安全性,达到容器挂了,数据还在的目的。相当于redis里面的rdb,aof
docker run -it --privileged=true -v /宿主机绝对路径:/容器内绝对路径:rw 镜像名称
a. Docker挂载主机目录出现没有权限问题解决:--privileged=true
b. -it 当然也可以-d创建一个后台运行的容器
c. 宿主机的绝对路径和容器的绝对路径会自动容器创建
d. 简单的来说就是在创建容器的时候加了一个-v的磁盘映射
e. ":rw"也可以不写,因为命令默认是读写的。ro: read only,容器内 只能读不能写
数据卷的继承和共享:--volumes-from 父类容器名称
八、* 安装mysql容器
想安装一款容器,去官网上搜索,然后往下拉看简介,如果安装容器,可以很容易上手。
a. 安装 docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=123 mysql:5.7
注意:
1、操作系统中如果已经有mysql了,安装会不成功。
2、不管是从哪里复制过来的命令,如果执行不成功,先把空格删除重新用英文输入输入一次
上面的命令运行会弹出来一堆警告,但是不影响容器的使用,我自己加了个端口映射创建没有警告了,观感上有点区别吧,其他应该没什么影响。
docker run -p 3306:3306 --name=mysqltest1 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
安装成功过后,大家可以连接一下没问题的,但是数据库编码默认是拉丁文的
show variables like 'character%';
这个时候如果如果有人把你的mysql容器给删除了,那你的责任就大了。
所以我们现在面临2个问题:
1、数据库编码问题
2、数据安全问题
聪明的同学一定想到了我们的数据卷,对就是他可以解决数据库安全问题,编码改下配置文件即可
docker run -p 3306:3306 --name=mysqltest2 -v /tmp/mysql5.7/log:/var/log/mysql -v /tmp/mysql5.7/data:/var/lib/mysql -v /tmp/mysql5.7/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
在主机目录新建文件 vim /tmp/mysql5.7/conf/my.cnf 内容如下
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
重启容器后观察编码是否改变,如果重启失败,说明你配置文件写错了。
这个时候可以进行测试:进入新建容器的mysql 创建数据库表,然后删除mysql容器,再按照上面的命令创建容器,进去容器查看数据库还在否。答案自己看了才惊喜呀!!
九、安装redis容器
docker run -p 6379:6379 --name=myredis15 --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data -d redis:6.2.6 redis-server /etc/redis/redis.conf
1、宿主机里的/app/redis/redis.conf 得提前准备好,下面是redis各个版本的下载路径,下载好之后取出里面的配置文件redis.conf 上传到app/redis目录。最好版本新点。
2、配置文件修改
注释掉:允许其他客户端
# bind 127.0.0.1
daemonize yes => no或者注释掉:因为这个设置会和docker run -d 冲突会导致重启失败
daemonize no
3、可以把配置文件中的 databases 数量修改为14,当你进入容器的redis后
redis-cli 链接到redis select 1是可以的select 15是不行的
说明服务器是读到了我们的配置文件。完成