1.启动类命令
启动docker
systemctl start docker
systemctl stop docker
systemctl restart docker
systemctl status docker
开机启动
systemctl enable docker
2.镜像命令
查询,--limit 前十个
docker search redis --limit 10
拉取镜像
docker pull mysql:5.7
展示所有镜像
docker images -a
查看docker占用内存容量情况
docker system df
虚悬镜像:仓库名和标签都是<none>的镜像
3.容器命令
--name 自定义容器名
-d 后台运行
-it 启动交互式容器(前台有伪终端,等待交互)
-p 8080:9090 docker端口8080映射到镜像的9090
退出交互:
docker run -it ubuntu /bin/bash
1.关闭容器 exit
2.退出容器 ctrl + p + q
启动已经停止的容器
docker start 容器
docker stop 容器
删除容器
docker rm 容器
docker rm -f 容器
删除镜像
docker rmi 镜像
启动守护式容器
-it 前台交互
-d 指定容器的后台运行模式
某一些服务-d启动后会立即消失,比如ubuntu,因为他需要实时的交互
有一些又不需要实时的交互,想mysql、redis,所以才有了-d这个模式
查看后台日志
docker logs 容器
查看容器内运行的进程
docker top 容器
查看容器内部细节
docker inspect 容器
进入正在运行的容器|并以命令行交互
docker exec -it 容器 /bin/bash
docker attach 容器
attach 直接进入容器启动命令的终端,不会启动新的进程。用exit退出会导致容器的停止
exec 是在容器中打开新的终端,并且可以启动新的进程。用exit退出不会导致容器停止
推荐用exec
从容器内拷贝文件到主机上
docker cp 容器:/tmp/a.txt /home/nginx/static
导入和导出容器
export 导出容器的内容留作为一个tar归档文件
import 从tar包中的内容创建一个新的文件系统再导入为镜像
导出
docker export 容器 > /路径名/文件名.tar
导入
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
cat 文件名.tar | docker import - 自定义镜像名/自定义:自定义
4.镜像分层概念
镜像概念:我们把应用程序和配置依赖打包好形成的一个可交付的运行环境就是image镜像文件
现象:我们下载镜像时是一层一层的去下载
UnionFileSystem联合文件系统:
一种分层,轻量级且高性能的文件系统,它支持文件系统的修改作为一次提交来一层一层的叠加。
同时可以将不同目录挂载到同一个虚拟文件系统下。联合文件系统是docker镜像的基础。镜像可以通过分层来进项集成,
基于基础镜像来制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,从外表看只看到一个文件系统。联合加载会把各层文件系统叠加在一起。
这样最终的文件系统会包含所有底层的文件和目录。
镜像加载原理:
bootfs:主要包含bootloader和kernel,bootloader主要引导记载kernel,Linux刚启动会加载bootfs文件系统,
在Docker镜像的最底层是引导文件系统bootfs。这一程包含boot加载器和内核,当boot加载完后整合内核就都在内存中了。
此时内存的使用权已经由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs:在bootfs之上,包含典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是何种不同操作系统的发行版。
对于有一个精简的OS,rootfs可以很小,只需要最基础的命令、工具包和程序库就可以了。所以Linux4G,但是Docker中的Linux才200M。
因为底层直接用Host的kernel,自己只需提供rootfs就行了。由此可见对于不同的linux发行版,bootfs基本是一致的,
rootfs有所差异,因此不同的发行版可以共用一个bootfs。
镜像的好处:
上面提到了共用bootfs。好处就是共享资源、方便复制迁移,就是为了复用。
比如多个镜像都是从相同的base镜像构建而来,那么Docker Host只需要在磁盘上保存一份base镜像;
同时内存中也只需要加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
镜像和容器
Docker镜像层都是只读的,容器层是可写的。
当容器启动时,一个新的可写层被加载到镜像的顶部。这一层成为容器层,容器层之下的叫做镜像层。
5.容器数据卷
数据卷定义:
卷就是目录或文件,存在于一个或多个的容器中,由docker挂载到容器,但不属于联合文件系统。可以用于持续存储或共享数据。
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
数据卷的作用
Docker容器产生的数据如果不备份,当容器实例删除后,容器内的数据自然也就没有了。
特点:
1.数据卷可以在容器之间共享或重用数据
2.卷中的更改可以直接实时生效
3.数据卷中的更改不会包含在镜像的更新中
4.数据卷的生命周期一直持续到没有容器使用它为止
数据卷使用
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内部目录 镜像名
如果宿主机没有这个目录,那么会自动创建
查看数据卷是否挂载成功
docker inspect 容器
里面的内容有Mounts,其中有详细的绑定信息
docker stop容器后,主机修改数据卷。docker容器重启后数据依然同步
数据卷的读写规则及映射添加说明
读写(默认):rw
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内部目录:rw 镜像名
只读(容器内只能读,不能写):ro
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内部目录:ro 镜像名
数据卷之间的继承
容器2继承容器1的卷规则,多容器宿主机共享
docker run -it --privileged=true --volumes-from 父类容器 --name u2 ubuntu
容器2继承的是规则,并不会因为容器1的stop而失效,容器1start后,他们还是共享的
6.常用软件安装
tomcat
新版tomcat访问报404:
1.可能是没有映射端口或者没有关闭防火墙
2.把tomcat中的webapps.dist目录转成webapps
docker exec -it 容器 /bin/bash
rm -r webapps
mv webapps.dist webapps
不用修改的tomcat8
docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8
mysql
docker run --name mymysql -e MYSQL_ROOT_PASSWORD=123456 -d -p 3306:3306 mysql:5.7.27
1.中文乱码问题:docker上默认字符集编码(不设置的话是latin不是utf8)
2.删除容器后,里面的mysql数据怎么办?
docker run -d -p 3306:3306 --name mymysql mysql:5.7.27 -e MYSQL_ROOT_PASSWORD=123456 --privileged=true
-v /home/mysql/log:/var/log/mysql
-v /home/mysql/data:/var/lib/mysql
-v /home/mysql/conf:/etc/mysql/conf.d
解决中文乱码问题
cd /home/mysql/conf/
vim my.cnf
[client]
default_character_set=utf8
[mysqld]
collation_server=utf8_general_ci
character_set_server=utf8
重启mysql docker restart mymysql
进入mysql看字符集改动
docker exec -it mymysql /bin/bash
mysql -uroot -p
SHOW VARIABLES LIKE 'character%';
当挂载数据卷后,只要挂载到了之前的文件,就可以不用担心数据丢失问题了。
redis
启动前配置
宿主机新建mkdir -p /home/redis
将原始的redis.conf放在该文件夹下,修改redis.conf文件
1.开启redis验证(要不要输密码,可选)
requirepass 123
2.允许redis外地连接(必须)
注释掉 # bind 127.0.0.1
3.daemonize no(必须)
把yes改为no
4.开启redis数据持久化(可选)
appendonly yes
5.保护模式关闭
protected-mode no
docker run -p 6379:6379 --name myredis -d redis --privileged=true
-v /app/redis/redis.conf:/etc/redis/redis.conf
-v /app/redis/data:/data
redis-server /etc/redis/redis.conf
如何证明自定义配置生效?
将配置文件中的databases 16 改为 10个
docker restart myredis