配置镜像加速:访问阿里云容器镜像服务,执行它所给代码
常用命令
帮助启动类命令
启动:systemctl start docker
停止:systemctl stop docker
重启:systemctl restart docker
查看状态:systemctl status docker
开机启动:systemctl enable docker
概要信息:docker info
总体帮助文档:docker --help
命令帮助文档:docker 具体命令 --help
镜像命令
docker images :查看本地主机上镜像
docker images -q :只查看id
docker images -aq: 只查看本地所有的镜像的id(包含历史映像层)
REPOSITORY | 镜像的仓库源 |
---|---|
TAG | 版本号 |
IMAGE ID | 镜像ID |
CREATED | 镜像创建时间 |
SIZE | 镜像大小 |
docker search redis:搜索redis
docker search --limit 5 redis:只显示前5个
docker pull redis:拉取
docker pull redis:6.0.8 拉取版本号为6.0.8,不写默认为最新
docker system df : 查看镜像容器所占用空间
docker rmi id(redis) :删除redis镜像携带id
docker rmi -f id :强力删除
docker rmi -f $
(
d
o
c
k
e
r
i
m
a
g
e
s
−
a
q
)
:支持
(docker images -aq) :支持
(dockerimages−aq):支持引用(禁止使用,这里只是展示
)
虚玄镜像:仓库名和id都是none,没什么意义,直接删除
偶遇虚玄镜像:用Dockerfile制作镜像失败时出现
可使用 rmi -f 或 docker image prune 删除
容器命令
docker run hello -word 相当于java实例化了一个对象
docker run --name 为容器指定名称
docker run -it --name=myU1 ubuntu bash
-d:后台启动并返回容器id
-i:交互模式运行容器
-t:为容器重新分配一个伪输入终端,it通常一起使用
docker run -it ubuntu 返回一个可交互输入终端(shell),退出exit
docker ps :展示所有正在运行的容器
docker ps -a:列出当前正在运行的容器+历史上运行过的
docker ps -l:显示最经创建的容器
docker ps -n :显示最近第n个创建的容器 docker ps -n 2
docker ps -q :静默模式,只显示容器编号ID
docker ps -a -q
退出容器
exit 容器会停止关闭
ctrl + p + q: 容器不会停止关闭
启动已经停止运行的容器: docker start 容器ID或者容器名
重启容器: docker restart 容器ID或者容器名
停止容器: docker stop 容器ID或者容器名
强制停止容器: docker kill 容器ID或者容器名
删除已经停止的容器(集装箱) docker rm 容器ID
强制删除未停止容器 docker rm -f 容器ID或名称
复合使用 docker rmi -f $(docker images -qa)
前台启动:docker run -it redis:6.2.6
后台启动:docker run -d redis:6.2.6
一般启动后查看进程:docker ps
查看日志: docker logs 3278899ee900[容器ID]
查看容器内运行进程:docker top 容器id (UID,PID,运行时间)
查看内部细节:docker inspect [容器id]
重新进入正在运行的容器:
- docker exec -it [容器id] {docker exec -it 3278899ee900 /bin/bash}
- docker attach [容器id]
- 工作上常用第一种
两者的区别:
-
exec是在容器中打开新的终端,并且可以启动新的进程,用exit推出,不会导致容器停止
-
attach直接进入容器启动命令的终端,不会启动新的进程,用exit退出,会导致容器停止
docker操作文件(拷贝、导入/出)
docker cp 容器id : 容器内路径 目的主机路径
将容器内部文件复制到容器外:
docker cp container:source_path output_path
将外部文件复制到容器内:
docker cp source container:target_path
导入导出容器:
导出:docker export 容器ID > 文件名.tar
docker export cb2323865a76 > ubuntu.tar 相当于备份了整个容器
导入:cat 文件名.tar | docker import -镜像用户/镜像名:镜像版本号
cat ubuntu.tar | docker import - linxi/ubuntu:3.7
导入容器形成新的镜像,然后运行恢复原样
docker镜像层是只读的,容器层是可读可写
总结
attach Attach to a running container # 当前 shell 下 attach 连接指定运行镜像
build Build an image from a Dockerfile # 通过 Dockerfile 定制镜像
commit Create a new image from a container changes # 提交当前容器为新的镜像
cp Copy files/folders from the containers filesystem to the host path #从容器中拷贝指定文件或者目录到宿主机中
create Create a new container # 创建一个新的容器,同 run,但不启动容器
diff Inspect changes on a container's filesystem # 查看 docker 容器变化
events Get real time events from the server # 从 docker 服务获取容器实时事件
exec Run a command in an existing container # 在已存在的容器上运行命令
export Stream the contents of a container as a tar archive # 导出容器的内容流作为一个 tar 归档文件[对应 import ]
history Show the history of an image # 展示一个镜像形成历史
images List images # 列出系统当前镜像
import Create a new filesystem image from the contents of a tarball # 从tar包中的内容创建一个新的文件系统映像[对应export]
info Display system-wide information # 显示系统相关信息
inspect Return low-level information on a container # 查看容器详细信息
kill Kill a running container # kill 指定 docker 容器
load Load an image from a tar archive # 从一个 tar 包中加载一个镜像[对应 save]
login Register or Login to the docker registry server # 注册或者登陆一个 docker 源服务器
logout Log out from a Docker registry server # 从当前 Docker registry 退出
logs Fetch the logs of a container # 输出当前容器日志信息
port Lookup the public-facing port which is NAT-ed to PRIVATE_PORT # 查看映射端口对应的容器内部源端口
pause Pause all processes within a container # 暂停容器
ps List containers # 列出容器列表
pull Pull an image or a repository from the docker registry server # 从docker镜像源服务器拉取指定镜像或者库镜像
push Push an image or a repository to the docker registry server # 推送指定镜像或者库镜像至docker源服务器
restart Restart a running container # 重启运行的容器
rm Remove one or more containers # 移除一个或者多个容器
rmi Remove one or more images # 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]
run Run a command in a new container # 创建一个新的容器并运行一个命令
save Save an image to a tar archive # 保存一个镜像为一个 tar 包[对应 load]
search Search for an image on the Docker Hub # 在 docker hub 中搜索镜像
start Start a stopped containers # 启动容器
stop Stop a running containers # 停止容器
tag Tag an image into a repository # 给源中镜像打标签
top Lookup the running processes of a container # 查看容器中运行的进程信息
unpause Unpause a paused container # 取消暂停容器
version Show the docker version information # 查看 docker 版本号
wait Block until a container stops, then print its exit code # 截取容器停止时的退出状态值
镜像生成
镜像分层,最底层只含有基础功能,上层含有更多功能但是占用储存就更大,类似洋葱
更新包管理工具
apt-get update
安装vim
apt-get -y install vim
现有容器添加以上功能后生成镜像
docker commit -m=“描述信息” -a=“作者” 容器ID 包名/镜像名:版本号
docker commit -m=“add vim ok” -a=“linsy” 87bfc58aae5c linsy/ubuntu:1.1
本地镜像发布到阿里云
一、 创建命名空间(包名)
二、创建镜像创库
三、根据操作指南执行命令
https://cr.console.aliyun.com/cn-hangzhou/instance/repositories
四、将镜像推送到Registry
选择第3点,切记命令不要自己打,粘贴过来改
docker login --username=aliyun4085408287 registry.cn-hangzhou.aliyuncs.com
密码为2***
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/linsy/ubuntu:[镜像版本号]
docker tag a572362318a2 registry.cn-hangzhou.aliyuncs.com/linsy/ubuntu:1.1
docker push registry.cn-hangzhou.aliyuncs.com/linsy/ubuntu:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/linsy/ubuntu:1.1
五、从Registry中拉取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/linsy/ubuntu:[镜像版本号]
docker pull registry.cn-hangzhou.aliyuncs.com/linsy/ubuntu:1.1
本地镜像发布到私有库
1. 下载镜像 Docker Registry
docker pull registry
2. 提交新生成的镜像:
docker commit -m="add ifconfig ok" -a="linsy" containerId linsy/ubuntu:1.2
3. 运行私有库 Registry
docker run -d -p 5000:5000 -v /linsy/myregistry/:/tmp/registry --privileged=true registry
默认情况,仓库被创建在容器的/var/lib/registry目录下,建议自行用容器卷映射,方便于宿主机联调
4. curl验证私服库有什么镜像
curl -XGET http://192.168.52.129:5000/v2/_catalog
空的:
5. 将新镜像:1.2修改符合私服规范的Tag
docker tag 镜像:Tag Host:Port/Repository:Tag
自己host主机IP地址
docker tag linsy/ubuntu:1.2 192.168.52.129:5000/ipubuntu:1.2
6. 取消docker 默认不允许的htpp推送镜像
在 /etc/dokcer/deamo.json中添加宿主机IP地址,别忘了逗号。
7. push推送到私有库
systemctl reload docker
docker push 192.168.52.129:5000/ipubuntu:1.2
8. curl 验证registry是否成功上传
curl -XGET http://192.168.52.129:5000/v2/_catalog
9. 从私服库中拉去镜像
docker pull 192.168.52.129:5000/ipubuntu:1.2
容器数据卷
坑:容器卷记得加入:–privileged=true =》开启权限
docker 挂载主机目录出现 cannot open directory .: Premission denied
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
容器数据卷的目的是:将容器内的数据保存在宿主机磁盘中,完成重要数据的持久化备份,这里是双向绑定,如果宿主机共享目录下增加了新文件那么容器内也会有
容器实例被删除了,只要数据卷还在,新启一个容器挂载数据卷目录,数据会备份回去。
特点:
- 数据卷可以在容器之间共享或重用数据
- 容器数据更改,数据卷实时备份
- 数据卷中的更改不包含在镜像中的更新
- 数据卷的生命周期一直持续到没有容器使用它为止
cp 和 import / export 都是手动、单向的、一次性的,-v 的挂载自动的、双向的、永久的
数据卷和主机互联互通
公式:docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data --name=U1 ubuntu
没有这个路径docker 会自建
将docker容器中镜像产生的重要文件实时备份到 Linux 操作系统磁盘中,当然Linux中该备份文件夹产生的内容也会同步到镜像中, 就是两个备份文件夹进行绑定
查看数据卷是否挂载成功
docker inspect 容器ID docker inspect 23e21a3b2c0f,以json形式返回容器各种信息
Mounts 挂载,类型:绑定,source:宿主机路径,Destination:docker路径。
容器和宿主机质之间数据共享
当docker中镜像停止运行,而Linux备份文件夹中产生新的数据,那么当镜像启动时Linux产生的该数据也会同步到镜像中
rw ro
默认rw可读可写, ro只读(只限制容器镜像)
-v /usr/local/nginx/logs:/var/log/nginx:rw
-v /usr/local/nginx/logs:/var/log/nginx:ro
继承与共享
类似于java继承,实现了容器数据卷之间的共享(u1,u2,host主机)
-v 全称就是 volumes
docker run -it --privileged=true -volumes-form 父类(如u1) --name u2 ubuntu
u2继承的是u1挂载路径的规则,当u1停止运行(f父类死亡),u2照样能找到主机
对已经启动的容器添加目录映射
挂在目录文件丢失
docker常规安装
tomcat
docker pull tomcat 安装最新版本
安装tomcat预想查看“猫”,就需要将tomcat镜像里的webapps文件删除,然后将webapps.dist改成webapps。
docker run …tomcat 后面直接写名字会寻找最新版运行,如果没有就会下载,所有最好写tomcat8的镜像ID
mysql
日常使用
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
docker exec -it mysql /bin/bash
生产上
加入三个数据卷(日志、数据、配置)
日常工作中一定要加数据卷,即使容器被删除了,再次启动数据还能备份回容器中。
docker run -d -p 3306:3306 --privileged=true \
-v /root/mysql/log:/var/log/mysql \
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql \
mysql:5.7
解决中文乱码(utf-8):进入conf目录,添加文件 my.cnf,重启
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
redis
复制一份redis.conf文件,或从网上下载,修改以下配置:
- 注释掉 # bind 127.0.0.1 (允许redis外地连接 )
- daemonize no (将daemonize no注释起来或者设置 daemonize yes,因为该配置和docker run中-d参数冲突,会导致容器一直启动失败)
- 开启redis数据持久化 appendonly yes 可选
docker run -p 6379:6379 --name redis --privileged=true \
-v /root/redis/redis.conf:/etc/redis/redis.conf \
-v /root/redis/data:/data \
-d redis redis-server /etc/redis/redis.conf
启动容器失败:
docker logs 容器id 查看报错
- 通过查看容器日志,确定是什么问题,docker logs -f -t --tail 行数 容器名
docker logs -f -t --tail 100
- 将容器中导致错误的文件拷贝到宿主机上
docker cp containerID:container_path host_path
说明
containerID:容器ID、
container_path:容器内文件路径(需拷贝的源文件)
host_path:宿主机路径(拷贝文件的目标)
- 修改拷贝出来的配置文件, 再将配置文件拷贝回去容器
docker cp host_path containerID:container_path
- 再次启动容器
docker start containerID
查看未启动容器文件结构
将镜像打包,然后移出查看
docker save nginx > nginx.tar