概述
以下笔记整理来自于bilibili狂神说Java,建议结合视频自学。
【狂神说Java】Docker最新超详细版教程通俗易懂_哔哩哔哩_bilibili
-----------------------------------------------docker入门start---------------------------------------------------------
Docker使用的内核是宿主机的内核,轻便。秒级
虚拟机需要虚拟出一整套操作系统及硬件,非常庞大,笨重。分钟级
- 安装docker(不同系统命令不一样,以官网为准 Get Docker | Docker Documentation)
2、镜像加速器
阿里云 阿里云-上云就上阿里云
控制台 --> 产品与服务(输入 “镜像” 搜索)--> 镜像加速器 --> 拷贝命令,运行
产品与服务(输入 “镜像” 搜索)
镜像加速器
拷贝命令,直接运行即可
通过将用户添加到docker用户组可以将sudo去掉,命令如下
sudo groupadd docker #添加docker用户组
sudo gpasswd -a $USER docker #将登陆用户加入到docker用户组中
newgrp docker #更新用户组
3、docker服务命令
systemctl start docker 启动
systemctl status docker 查看状态
systemctl stop docker 停止
systemctl restart docker 重启
systemctl enable docker 开机自启动
4、docker镜像命令
docker images 查看所有镜像
docker images -q 查看所有镜像id
docker search image_name 从网络中查找需要的镜像。
docker pull 镜像名称 : 版本号(默认lastest)
拉取镜像,版本号可去Docker Hub 查看
删除镜像
docker rmi 镜像id
docker rmi 镜像名称 : 版本号
删除全部镜像
docker rmi `docker images -q`
修改镜像名称
docker tag IMAGE_ID new_image_name : new_image_tag
docker rmi old_image_name : old_image_tag #删除旧的镜像,也可以不删除,看个人需 求
查看镜像历史,镜像是如何生成的(官方镜像,或者dockerfile自己生成的镜像)
docker history 镜像id(或者 镜像名:版本)
5、docker容器命令
创建容器
docker run -it(-id) --name=cyy_python 镜像名称:镜像版本 /bin/bash
-i 一直保持连接(容器没有客户端连接。就开会断开)
-t 给容器分配尾终端,可以输入命令,-it交互式容器,退出即关闭
-d 后台运行,退出后依然在,-id守护(后台)模式运行容器,退出后依然在
-p 指定容器的端口 -p 8080 : 8080
-p ip:主机端口 : 容器端口
-p 主机端口 : 容器端口
-p 容器端口
-P 随机指定端口 大写P,随机指定端口
--name=container_name 容器名称
/bin/bash 打开shell窗口 ,也可以是其它命令,ip ping ls 等
docker run -it --rm tomcat : 9.0
# 一般用来测试,容器创建,使用完自动删除
进入当前正在运行的容器
docker exec -it 容器名 /bin/bash
docker exec -it -u root 容器名 /bin/bash (root身份进入docker容器)
# exec进入容器后开启一个新的终端,可以在里面 操作(常用)
docker attach 容器id
# attach进入容器正在执行的终端,不会启动新的进程!
退出容器
Exit #停止容器并退出
Ctrl + P + Q #不停止容器退出
查看正在运行的容器
docker ps
查看所有容器
docker ps -a
查看容器id
docker ps -q
查看最近创建的容器,前5个
dockers ps -n=5
启动容器
docker start container_name
docker restart container_name #重启
停止当前正在运行的容器
docker stop container_name
强制停止当前容器
docker kill container
删除容器(正在运行的容器不能删除,先停后删) -f 强制删除
docker rm container_name(container_id)
删除所有容器
docker rm `docker ps -aq`
或者 docker ps -a -q | xargs docker rm
其它常用命令:
docker run -d 镜像名 #后台运行
# Docker容器使用后台运行就必须要有一个前台进程,docker发现没有应用,就会 自动停 止。
显示日志
docker logs -tf --tail num 容器id
-tf #显示日志
--tail #要显示的条数
查看容器的进程信息 top命令
docker top 容器id
查看镜像元数据(查看容器详细信息) inspect
docker inspect container_name
从容器内拷贝文件到主机
docker cp 容器id : 容器内路径 目的的主机路径
下载的镜像缺少东西:
阿里云镜像默认下载最小镜像,所有不必要的都剔除掉,保证最小可运行环境。
查看docker运行中的容器的实时数据流
docker stats
环境配置 -e
如mysql需要配置密码
Docker run …… -e MYSQL_ROOT_PASSWORD=myPwd --name=……
联合文件系统
Docker下载镜像时,会自底向上逐层下载,两个不同的镜像,其底层可能相同,docker在下
载镜像时,不会再下载相同的层
----------------------------------------------------docker入门end------------------------------------------------------
6、docker容器的数据卷 -v
数据卷概念
数据卷是宿主机的一个目录或文件
容器目录与数据卷目录绑定后,数据同步(容器内目录挂载到linux上面)
一个数据卷可以被多个容器同时挂载
一个容器可以挂载多个数据卷
数据卷作用:
容器数据持久化,防止删除容器时,数据也删除
外部机器与容器间接通信
容器之间数据交换、共享
配置数据卷
docker run …… -v 宿主机目录(文件):容器内目录(文件) ……
Eg: docker run -it --name=c1 -v /root/data:/root/data_container
--privileged=true python:3.9.9-bullseye /bin/bash
**注意事项
- 目录必须是绝对路径
- 目录不存在,自动创建
- 可以挂载多个数据卷(多个-v)
数据卷容器
1、创建启动c3数据卷容器,使用-v参数,设置数据卷(容器挂载主机)
docker run -it --name=c3 -v /volume(名称不固定) python:3.9.9-bullseye /bin/bash
2、创建启动c1、c2容器,使用--volumes-from 参数设置数据卷(容器挂载容器)
docker run -it --name=c1 --volumes-from c3 python:3.9.9-bullseye /bin/bash
docker run -it --name=c2 --volumes-from c3 python:3.9.9-bullseye /bin/bash
# c3相当于宿主机的地位
查看所有volum的情况
docker volume ls
具名挂载和匿名挂载
匿名挂载
-v 容器内目录
具名挂载 常用
-v 卷名:容器内路径
docker volume inspect 卷名
# 查看挂载的目录(主机) /var/lib/docker/volumes/卷名/_data
-v 容器内路径:ro(rw) 改变读写权限,一旦设置容器权限,容器对挂载出来的内容就有限定了,ro就说明这个路径只能通过宿主机操作,不能通过容器操作,限制容器。
ro:只读 read only
rw:可读可写 read write
8、Dockerfile(制作镜像)
docker镜像的本质是:一个分层的文件系统
制作镜像:
- 容器转为镜像
docker commit -m=”描述信息” -a=”作者” 容器id 目标镜像名称:版本号
docker save -o 压缩文件名称 镜像名称:版本号 (镜像转压缩文件)
docker load -i 压缩文件名称 (压缩文件转镜像)
2、Dockerfile(常用)
Dockerfile是一个文本文件。
docker build -f ./dockerfile -t 新镜像名称:新镜像版本 .(路径)
Dockerfile 文件内容,指令(大写) 参数
FROM centos
VOLUME [“volume01” , ”volume02”]
CMD echo “----end----”
CMD /bin/bash
构建步骤
- 编写一个dockerfile文件
- docker build 构建成为一个镜像
- docker run 运行镜像--容器
- docker push 发布镜像(DockerHub、阿里云镜像仓库)
Dockerfile : 构建文件,定义了一切步骤,源代码
DockerImages : 通过Dockerfile构建生成的镜像,最终发布和运行的产品,原来是jar war
DockerContainer : 容器就是镜像运行起来提供服务。
DockerFile指令
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像作者 姓名+邮箱
RUN #镜像构建的时候需要运行的命令
ADD #步骤:tomcat镜像,这个tomcat压缩包,添加内容
WORKDIR #镜像的工作目录
VOLUME #挂载的目录
EXPOSE #暴露端口配置
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD #当构建一个被继承dockerfile,就会运行ONBUILD的指令,触发指令
COPY #类似ADD,将文件拷贝到镜像中
ENV #构建的时候设置环境变量
*** CMD ENTRYPOINT 区别
CMD:
FROM centos
CMD ["ls","-a"]
运行镜像 docker run centos_cmd_test:1.0 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
ERRO[0000] error waiting for container: context canceled
解释:cmd的请理下 -l 替换了 ls -a 命令 ,-l不是命令,所以报错
ENTRYPOINT
FROM centos
CMD ["ls","-a"]
运行镜像 docker run centos_cmd_test:1.0 -l
命令追加 ls -a -l 不报错
创建一个自己的centos
- 编写dockerfile的文件
FROM centos
MAINTAINER chengyuyun<1686843416@qq.com>
ENV MYPATH /home/cyy/workspace/docker
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash
2.通过dockerfile文件构建镜像
docker build -f dockerfile文件路径 -t 镜像名 : 版本号 .
创建tomcat镜像
1、准备镜像文件tomcat压缩包,jdk压缩包
2、编写dockerfile
FROM centos
MAINTAINER cyy<1686843416@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u321-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.58.tar.gz /usr/local
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.58
ENV CATALINA_PATH /usr/local/apache-tomcat-9.0.58
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.58/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.58/bin/logs/catalina.out
发布镜像--docker hub
- Docker Hub注册账号
- 服务器端登录 docker login (登出 docker logout)
- docker -u yourUserName
- docker -p yourPwd
- 登录后可以提交镜像
镜像要命名成 dockerHubUsername/XXXX:版本号
docker push dockerHubUsername/mytomcat:1.0
发布到aliyun镜像服务上面
- 登录aliyun 阿里云-上云就上阿里云
- 找到容器镜像服务
- 创建命名空间
4.创建容器镜像(之后按网页提示操作)
一下内容来阿里云网页
1. 登录阿里云Docker Registry
$ docker login --username=xxx registry.cn-hangzhou.aliyuncs.com
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
您可以在访问凭证页面修改凭证密码。
2. 从Registry中拉取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/空间名/仓库名:[镜像版本号]
3. 将镜像推送到Registry
$ docker login --username=xxx registry.cn-hangzhou.aliyuncs.com
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/空间名/仓库名:[镜像版本号]
$ docker push registry.cn-hangzhou.aliyuncs.com/空间名/仓库名:[镜像版本号]
请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。
4. 选择合适的镜像仓库地址
从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。
如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-hangzhou.aliyuncs.com 作为Registry的域名登录。
5. 示例
使用"docker tag"命令重命名镜像,并将它通过专有网络地址推送至Registry。
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
registry.aliyuncs.com/acs/agent 0.7-dfb6816 37bb9c63c8b2 7 days ago 37.89 MB
$ docker tag 37bb9c63c8b2 registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
使用 "docker push" 命令将该镜像推送至远程。
$ docker push registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
docker 网络
ip addr
lo:本机回环地址
docker0:docker地址
查看容器内部网络地址,容器启动的时候IP地址是docker分配的
Linux可以ping通docker容器内部
原理:
- 每启动一个docker容器,docker就会给docker容器分配一个ip,只要安装了docker,就会有一个网卡docker0桥接模式,使用的技术是veth-pair技术。
- 容器带来的网卡,都是一对一对的。
- veth-pair就是一堆的虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连。正因为有这个特性,veth-pair充当一个桥梁,连接各种虚拟网络设备
结论
容器和容器之间是可以ping通的
所有容器不指定网络的情况下,都是由docker0路由的,docker会给容器分配一个默认的可用ip
Docker使用的是linux的桥接,宿主机中是一个docker容器的网桥 docker0
Docker中的所有网络接口都是虚拟的,虚拟的转发效率高。
只要容器删除,对应的网桥一对就没了
启动容器时,--link 容器名 可以指定连接容器,指定后可以直接ping容器名,而不用 ping ip 。 不建议使用link。
自定义网络不适用docker0
Docker0问题:不支持容器名连接访问。
自定义网络
查看所有docker网络 docker network ls
网络模式
bridge : 桥接(默认,自己创建也使用bridge模式)
none : 不配置网络
host : 与宿主机共享网络
container : 容器内网络连通(用的少,局限大)
创建自定义网络(docker0的问题都解决了,可以不使用--link)
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 cyy-net
网络连通
把一个容器连接到网络上
docker network connect [OPTIONS] NETWORK CONTAINER
docker network connect cyy-net tomcat01
连通之后将tomcat01放到cyy-net网络下
一个容器两个ip地址
配置 Elasticsearch
docker run -d --name=es_7.6.2 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
配置 Mysql
docker run -d -p 3310:3306 -v /home/cyy/workspace/mysql/conf:/etc/mysql/conf.d -v /home/cyy/workspace/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=yourPwd --name=mysql_8 mysql:8.0
Redis集群部署
创建自定义网络
docker network create redis --subnet 172.38.0.0/16
Shell脚本
for port in $(seq 1 6);
do
mkdir -p /home/cyy/workspace/mydata/redis/node-${port}/conf
touch /home/cyy/workspace/mydata/redis/node-${port}/conf/redis.conf
cat << EOF >>/home/cyy/workspace/mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
开启第一个
docker run -p 6371:6379 -p 16371:16379 --name redis-1
-v /home/cyy/workspace/mydata/redis/node-1/data:/data
-v /home/cyy/workspace/mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf
-d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
开启第二个
docker run -p 6372:6379 -p 16372:16379 --name redis-2
-v /home/cyy/workspace/mydata/redis/node-2/data:/data
-v /home/cyy/workspace/mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf
-d --net redis --ip 172.38.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
…… 把六个都开启
创建集群(先进入redis容器内)
docker exec -it redis-1 /bin/sh
创建集群
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1
SpringBoot微服务打包docker镜像
- 构建springBoot微服务项目
- 打包应用
- 编写Dockerfile,将Dockerfile与jar放在同一目录下
- 构建镜像 docker build -t cyy:1.0 .
- 发布运行 docker run -d -P --name cyy_springboot-web cyy:1.0
Others
1、清空日志:
cat /dev/null >/var/lib/docker/containers/containerid/containerid.log-json.log
例:cat /dev/null >/var/lib/docker/containers/29ef21de818cbe2a25c79aa8216bfe3e5108cbe5f73ada60a1086ee44692b5c8/29ef21de818cbe2a25c79aa8216bfe3e5108cbe5f73ada60a1086ee44692b5c8-json.log
(containerid:全id,docker ps 只能看到部分,cd /var/lib/docker/containers/ 看全部id)
2、日志导出文件
docker logs --since=”startTime” 容器id >> fileName.log
例:docker logs --since=”20200416” 容器id >> fileName.log
3、docker服务重启
service docker restart
容器内部分命令无法使用
Docker容器内无法使用vim
- root身份进入docker容器docker exec -it -u root 容器名 /bin/bash(如果容器未启动,先启动容器,再进入 docker start container_id)
- vim: command not found,--> 安装vim apt-get install vim
可是当你敲apt-get install vim命令时,提示:
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package vim
- apt-get update,这个命令的作用是:同步 /etc/apt/sources.list 和
/etc/apt/sources.list.d 中列出的源的索引,这样才能获取到最新的软件包。
- apt-get install vim
Docker 容器无法使用ll(ls -a)命令
1. vim ~/.bashrc
2. 加入一行 alias ll='ls $LS_OPTIONS -l' 保存退出
3. source ~/.bashrc
Docker 容器内无法运行ip、ping命令,进入容器
apt-get update
apt-get install -y iproute2 # 装ip
apt install iputils-ping # 装ping
docker添加用户到用户组(切换到管理员身份)
sudo gpasswd -a $USER docker #将登陆用户加入到docker用户组中
newgrp docker #更新用户组
最后
以上就是微笑心锁为你收集整理的docker详解的全部内容,希望文章能够帮你解决docker详解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复