Docker学习笔记
1、docker的安装
# 1.卸载旧的版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 2.需要的安装包
sudo yum install -y yum-utils
# 3.设置镜像的仓库
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo # 国外的,比较慢,不推荐用
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 阿里云镜像地址
# 4.更新yum软件包索引
yum makecache fast
# 5.安装docker相关的 docker-ce:社区版 ee:企业版
sudo yum install docker-ce docker-ce-cli containerd.io
# 6.启动docker
systemctl start docker
# 7.运行 hello-world
docker run hello-world
# 8.查看镜像
docker images
卸载docker
# 1.卸载 Docker Engine、CLI 和 Containerd 包:
sudo yum remove docker-ce docker-ce-cli containerd.io
# 2.主机上的映像、容器、卷或自定义配置文件不会自动删除。删除所有镜像、容器和卷:
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
配置阿里云镜像加速
-
登录阿里云,产品 > 弹性计算 > 容器镜像服务
-
找到镜像加速器,找到配置,执行
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://nmuw5bat.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
底层原理
docker是一个client-server的结构,docker的守护进程在主机上。通过docker在客户端访问。
DockerServer收到Docker-Client的命令,就会执行这个命令
2、Docker的常用命令
1、帮助命令
# 帮助命令
docker 命令 --help
# 版本信息
docker version
# docker系统信息,包括镜像和容器的数量
docker info
# docker所有命令
docker --help
2、镜像命令
# 查看本地主机上的镜像
docker images
# 搜索镜像
docker search 镜像名称
# 下载镜像
docker pull 镜像名[:tag] # 不写tag,默认是latest,最后一个版本,也就是最新版本
# 删除镜像
docker rmi -f 镜像名或镜像id
docker rmi -f $(docker images -aq) # 删除所有的镜像
3、容器命令
说明:我们有了镜像才可以创建容器,接下来我们下载一个centos镜像来测试学习
docker pull centos
新建容器并启动
docker run [可选参数] 镜像
# 可选参数说明
--name="Name" # 启动容器的名字,用以区分
-d # 后台运行方式 如nohup
-it # 使用交互方式运行,进入容器查看内容
-p # 指定容器的端口,如8080
-p 主机端口:容器端口
-p 容器端口
—P # 随机指定端口
# 测试,启动并进入容器
[root@192 ~]# docker run -it centos /bin/bash
[root@936be62b0405 /]#
# 查看容器内的centos目录
[root@936be62b0405 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
# 退出并停止容器
exit
# 查看正在运行的容器
docker ps # 当前所有正在运行的容器
-a # 列出当前所有正在运行的容器 + 历史运行过的容器
-n=? # 显示最近创建的容器
退出容器
# 退出并停止容器
exit
# 退出不停止容器
Ctrl + P + Q
删除容器
# 删除指定的容器 (不能删除正在运行的容器,要强制删除使用:docker rm -f )
docker rm 容器id
# 删除所有容器
docker rm $(docker ps -qa)
启动和停止容器操作
# 启动
docker start 容器id
# 重启
docker restart 容器id
# 停止
docker stop 容器id
# 杀掉
docker kill 容器id
4、常用的其它命令
1、后台启动容器
docker run -d 容器名
2、查看容器的日志
docker logs -tf 容器id
--tail number # 显示日志条数
3、查看容器中进程信息
docker top 容器id
4、查看容器的元数据信息
docker inspect 容器id
5、进入当前运行的容器
# 方式一(常用:进入容器,开启一个新的终端,可以在里面操作)
docker exec -it 容器id /bin/bash
# 方式二(进入容器正在执行的终端,不会启动新的进程)
docker attach 容器id
6、从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 目的主机路径
3、练习
1、docker安装nginx
# 搜索nginx
docker search nginx
# 下载nginx镜像
docker pull nginx
# 查看镜像
docker images
# 启动容器
docker run -d --name nginx01 -p 3344:80 nginx # 注意:-p:端口暴露
# 查看运行的容器
docker ps
# 测试nginx是否能访问
curl localhost:3344
2、docker启动tomcat
# 下载并启动tomcat
docker run -it --rm tomcat:9.0 # --rm : 容器用完即删(一般测试使用)
docker run -d -p 3355:8080 --name tomcat01 tomcat:9.0
3、docker查看内存的命令
docker stats
问题:我们每次修改一些配置文件,都要进入容器内部修改,十分的麻烦。
要是能在容器外部提供一个映射路径,只在外部做修改就能同步到容器内部的配置就好了。
4、可视化
docker图形化管理界面,提供一个后台面板供我们操作
1、portainer(先用这个)
# 安装启动
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
2、Rancher(CI/CD再用)
4、Docker容器、镜像迁移
-
保存本地文件,再加载
# 提交镜像
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名[:tag]
# 镜像保存为文件
docker save -o "文件名".tar "镜像名":版本
# 文件拷贝到目标机器,在目标机器加载镜像
docker load -i "镜像文件名".tar
-
镜像推送远程仓库,要用就从远程仓库拉取
# 打tag
docker tag 目标镜像:版本 仓库名:版本
# 推送
docker push 仓库名:版本
# 登录到docker hub
docker login
# 推送完以后,建议登出
docker logout
5、容器数据卷
将应用和容器打包成一个镜像!
数据都在容器中,如果把容器删除,那么容器中的数据也没了,这时候我们需要数据持久化
容器有一个数据共享的技术!docker容器中产生的数据可以同步到本地!
这就是卷技术,容器内的目录挂在到我们本地linux的目录上
1、使用数据卷
方式一:直接使用命令命令来挂载:-v
docker run -it -v 主机目录:容器目录 -p 主机ip:容器暴露ip 镜像
# 例如:同步容器的tomcat的webapps目录同步数据
docker run -d -p 8080:8080 --name tomcat01 -v /tmp/webapps:/usr/local/tomcat/webapps tomcat:9.0
好处:容器内的数据同步到本地
方式二:匿名挂载和具名挂载
# 匿名挂载(顾名思义,就是没有名字的挂载)
-v 容器路径
# 具名挂载
-v 卷名字:容器路径
注意:多有docker容器的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxxx/_data
卷的相关命令
# 查看所有卷
docker volume ls
# 查看具体卷的信息
docker volume inspect 卷名
拓展
# 通过 -v 容器内路径:ro 或 -v 容器内路径:rw 来改变读写权限
ro read only
rw read write
2、初识DockerFile
DockerFile 就是用来构建docker镜像的构建文件!命令脚本,通过这个脚本可以生成镜像。
# 脚本内容
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
# 运行脚本,生成镜像
docker build -f 脚本文件 -t 生成的镜像名 生成的路径
容器与容器间的数据同步
# 启动容器时使用 --volumes-from 参数,例如:
docker run -it --name 容器名称 --volumes-from 父容器名称 镜像
6、DockerFile
1、构建过程
基础知识:
-
每个保留关键字(命令)都必须是大写字母
-
从上到下的执行顺序
-
#表示注释
-
每个命令都会创建和提交一层镜像层
FROM # 基础镜像,一切从这里开始
MAINTAINER # 镜像是谁写的,(姓名 + 邮箱)
RUN # 镜像构建的时候需要运行的命令
ADD # 添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 暴露端口
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承的DockerFile,这个时候就会运行ONBUILD的指令
COPY # 类似ADD命令,将我们的文件拷贝到镜像中
ENV # 构建的时候设置环境变量
2、构建一个自己的centos
-
编写DockerFile文件test-dockerfile
FROM centos
MAINTAINER zhouq<568390181@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash -
构建
docker build -f test-dockerfile -t mycentos:0.1 .
我们可以查看镜像的变更历史
docker history 镜像id
3、实战:构建Tomcat镜像
-
准备镜像文件:tomcat压缩包,jdk压缩包
-
编写DockerFile文件,官方命名Dockerfile,build的时候可以不用-f指定文件,会自动寻找这个文件
FROM centos
MAINTAINER zhouq<568390181@qq.com>
# 拷贝文件到指定目录
COPY readme.txt /usr/local/readme.txt
# 添加tomcat和jdk
ADD apache-tomcat-9.0.52.tar.gz /usr/local
ADD jdk-8u161-linux-x64.tar.gz /usr/local
# 下载vim命令
RUN yum -y install vim
# 指定工作目录
ENV MYPATH /usr/local
WORKDIR $MYPATH
# 配置java环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_161
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# 配置tomcat环境变量
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.52
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.52
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
# 暴露端口
EXPOSE 8080
# 通过命令启动tomcat
CMD /usr/local/apache-tomcat-9.0.52/bin/startup.sh && tail -f /usr/local/apache-tomcat-9.0.52/bin/logs/catalina.out -
构建镜像
docker build -t mytomcat:1.0 .
-
启动镜像
4、发布镜像
-
地址:
-
命令登录docker hub
# 登录
docker login -u 用户名
# 然后输入密码 -
push命令提交
docker push 镜像[:tag]
# 如果提交出现错误,可以把镜像改个名字
docker tag 镜像id 新镜像名[:tag]
5、配置阿里云镜像仓库
1. 登录阿里云Docker Registry
$ docker login --username=快乐程序员2021 registry.cn-hangzhou.aliyuncs.com
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
您可以在访问凭证页面修改凭证密码。
2. 从Registry中拉取镜像
$ docker pull registry.cn-hangzhou.aliyuncs.com/docker-zhouq/docker-test:[镜像版本号]
3. 将镜像推送到Registry
$ docker login --username=快乐程序员2021 registry.cn-hangzhou.aliyuncs.com
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/docker-zhouq/docker-test:[镜像版本号]
$ docker push registry.cn-hangzhou.aliyuncs.com/docker-zhouq/docker-test:[镜像版本号]
请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。
4. 选择合适的镜像仓库地址
从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。
如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-hangzhou.aliyuncs.com 作为Registry的域名登录。
5. 示例
使用"docker tag"命令重命名镜像,并将它通过专有网络地址推送至Registry。
$ docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEregistry.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
7、Docker网络
问题:容器与容器之间网络是怎么通信的呢
我们每启动一个docker容器,docker都会为容器分配一个ip
1、--link
容器与容器间通过容器名连接通信
# 例如:
docker run -d -P --name tomcat02 --link tomcat01 tomcat
8、安装示例:
mysql
docker run -p 33056:33056 \
--name mysql \
--mount type=bind,src=/mydata/mysql/conf/my.cnf,dst=/etc/mysql/my.cnf \
--mount type=bind,src=/mydata/mysql/data,dst=/var/lib/mysql \
--mount type=bind,src=/mydata/mysql/logs,dst=/var/log \
--mount type=bind,src=/mydata/mysql/mysql-files,dst=/var/lib/mysql-files \
-e MYSQL_ROOT_PASSWORD=root123 \
-d mysql:8.0.27
redis
docker run -p 33465:33465 \
--name redis \
-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \
-v /mydata/redis/data:/data \
-d redis redis-server /etc/redis/redis.conf
redis.conf
save 900 1
save 300 10
save 60 1000
port 33465
daemonize yes
naocs集群
docker run -d \
-e NACOS_SERVERS=ip1:端口,ip2:端口 \
-e NACOS_SERVER_IP=访问ip \
-p 28848:28848 \
-v /mydata/nacos/conf/application.properties:/home/nacos/conf/application.properties \
-v /mydata/nacos/logs/:/home/nacos/logs/ \
--name nacos \
nacos/nacos-server:2.0.3
Elasticsearch
docker run --name elasticsearch -p 9200:9200 \
-p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.8.0
Elasticsearch集群
version: '3.6'
services:
es1:
image: elasticsearch:7.8.0
container_name: es1
restart: always
environment:
- "ES_JAVA_OPTS=-Xms256m -Xmx256m"
volumes:
- /mydata/elasticsearch/config/es1/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- /mydata/elasticsearch/data/es1:/usr/share/elasticsearch/data
- /mydata/elasticsearch/logs/es1:/usr/share/elasticsearch/logs
- /mydata/elasticsearch/plugins/es1:/usr/share/elasticsearch/plugins
ports:
- 9201:9201
- 9301:9301
networks:
- elastic
es2:
image: elasticsearch:7.8.0
container_name: es2
environment:
- "ES_JAVA_OPTS=-Xms256m -Xmx256m"
restart: always
volumes:
- /mydata/elasticsearch/config/es2/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- /mydata/elasticsearch/data/es2:/usr/share/elasticsearch/data
- /mydata/elasticsearch/logs/es2:/usr/share/elasticsearch/logs
- /mydata/elasticsearch/plugins/es2:/usr/share/elasticsearch/plugins
ports:
- 9202:9202
- 9302:9302
depends_on:
- es1
networks:
- elastic
es3:
image: elasticsearch:7.8.0
container_name: es3
restart: always
environment:
- "ES_JAVA_OPTS=-Xms256m -Xmx256m"
volumes:
- /mydata/elasticsearch/config/es3/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- /mydata/elasticsearch/data/es3:/usr/share/elasticsearch/data
- /mydata/elasticsearch/logs/es3:/usr/share/elasticsearch/logs
- /mydata/elasticsearch/plugins/es3:/usr/share/elasticsearch/plugins
ports:
- 9203:9203
- 9303:9303
depends_on:
- es1
networks:
- elastic
kibana:
image: kibana:7.8.0
container_name: kibana
environment:
ELASTICSEARCH_HOSTS: '["http://1.117.226.189:9201","http://1.117.226.189:9202","http://1.117.226.189:9203"]'
ports:
- 5601:5601
networks:
- elastic
depends_on:
- es1
networks:
elastic:
Nginx
docker run -p 80:80 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/logs/nginx \
-v /mydata/nginx/conf:/etc/nginx \
-d nginx:stable
Kibana
docker run --name kibana \
-e ELASTICSEARCH_HOSTS=http://127.0.0.1:9200 \
-p 5601:5601 \
-d kibana:7.8.0
RabbitMq
docker run -d \
--name rabbitmq \
-p 5671:5671 \
-p 5672:5672 \
-p 4369:4369 \
-p 25672:25672 \
-p 15671:15671 \
-p 15672:15672 \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=admin \
rabbitmq:3.10.0-rc.3-management
idea docker插件配置
<build>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>${docker.version}</version>
<configuration>
<!-- Docker 远程管理地址-->
<dockerHost>http://ip地址:2375</dockerHost>
<!-- Docker 推送镜像仓库地址-->
<pushRegistry>http://ip地址:5000</pushRegistry>
<!--是否推送镜像-->
<pushImage>true</pushImage>
<!--推送后是否覆盖已存在的标签镜像-->
<forceTags>true</forceTags>
<!--镜像名称-->
<imageName>${project.artifactId}:${project.version}</imageName>
<!--Dockerfile-->
<dockerDirectory>${project.basedir}/docker</dockerDirectory>
<!--插件会将需要的资源拷贝到 docker目录下,供Dockerfile里构建镜像使用-->
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)