docker 学习笔记
1、基本命令
docker version #查看docker的版本信息 docker info #查看docker的系统信息,包括镜像和容器数量 docker 命令--help #查看命令帮助文档
2、镜像命令
docker images #查看本地主机所有镜像 docker search #搜索镜像 docker pull 镜像名 #下载镜像 docker rmi -f 镜像ID #删除镜像 docker rmi -f $(docker images -aq) #递归删除所有镜像
3、容器命令
docker pull 容器名 #拉取一个容器 例:docker pull centos docker run [可选参数] image #参数说明 --name="名字" 指定容器名字 -d 后台方式运行 -it 使用交互方式运行,进入容器查看内容 -p 指定容器的端口 ( -p ip:主机端口:容器端口 配置主机端口映射到容器端口 -p 主机端口:容器端口 -p 容器端口 ) -P docker run -it centos /bin/bash #运行并进入容器 exit #退出容器 Ctrl+P+Q 不停止容器退出 docker ps -a #查看列出所有运行的容器 docker rm 容器Id #删除容器,不能删除正在运行的容器,强制删除使用 rm docker rm -f $(docker ps -aq) #删除所有的容器 docker ps -a -q|xargs docker rm #删除所有的容器 docker start 容器id #启动容器 docker restart 容器id #重启容器 docker stop 容器id #停止当前运行的容器 docker kill 容器id #强制停止当前容器 docker update --restart=always 容器id #无论退出状态是如何,都重启容器 #进入容器,如果vi提示未找到命令,需要安装 apt-get update apt-get install vim
4、其他命令
docker logs -tf 容器id docker logs --tail="10" 136dc0a9dc7c docker logs --tail number 容器id #num为要显示的日志条数 docker top 容器ID #查看容器中进程信息 docker inspect 容器ID #查看容器的元数据 docker exec -it 容器ID /bin/bash #进入当前正在运行的容器 docker attach 容器ID #进入当前正在运行的容器 docker cp 容器id:容器内路径 目的主机路径 #拷贝容器的文件到主机中 docker cp 要拷贝的文件路径 容器名:要拷贝到容器里面对应的路径 docker exec 进入容器后开启一个新的终端,可以在里面操作 docker attach 进入容器正在执行的终端,不会启动新的进程
5、Docker 安装 Nginx
docker pull nginx
docker run -d --name nginx01 -p 3334:80 nginx
-d 后台运行
--name 给容器命名
-e TZ="Asia/Shanghai" 设置时区
-p 3334:80 将宿主机的端口3334映射到该容器的80端口
如果报下面错误,执行命令重启docker服务 systemctl restart docker
docker: Error response from daemon: driver failed programming external
connectivity on endpoint lamp
6、运行NetCore程序
docker pull microsoft/dotnet #安装Net docker run -it microsoft/dotnet //创建demo文件夹 $ mkdir demo $ cd demo //创建项目名为HelloDocker.Web的.NET Core MVC项目 dotnet new mvc -n HelloDocker.Web //进入HelloDocker.Web文件夹 cd HelloDocker.Web //启动.NET Core MVC项目 dotnet run //将宿主文件信息共享到docker 容器中,挂载 docker run -it \-v /use/local/webside/testDocker/HelloDocker.Web:/app \ microsoft/dotnet:latest
下载NetCore3.1版本
docker pull mcr.microsoft.com/dotnet/core/aspnet:3.1
注意坑,下载的NetCore3.1是精简版本,通过dotnet命令可以看到,所以它出了帮助命令外,只能运行一个带文件路径的应用程序。
将项目发布好后,一般是publish目录,在目录中新建Dockerfile文件
Dockerfile是用来构建docker镜像文件,命令参数脚本!
步骤:
1、编写一个dockerfile文件,
2、dicker build 构建成为一个镜像
3、docker run 运行镜像
4、dicker push 发布镜像(DockerHub 阿里云镜像)
命令:
1、每个保留关键字(指令)都必须是大写字母
2、执行从上到到下顺序执行,
3、#代表注释,
4、每一个指令都会创建提交一个新的镜像层,并提交
CMD #指定这个容器启动的时候要运行的命令,只能最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动的时候要运行的额名了,可以追加命令
DockerFile常用指令
FROM # 基础镜像,一切从这里开始构建 MAINTAINER # 镜像是谁写的, 姓名+邮箱 RUN # 镜像构建的时候需要运行的命令 ADD # 拷贝文件(支持正则表达式)到镜像,并自动解压(如果是压缩包) WORKDIR # 镜像的工作目录 VOLUME # 挂载的目录 EXPOSE # 保留端口配置 CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。 ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令 COPY # 类似ADD,将我们文件拷贝到镜像中 ENV # 构建的时候设置环境变量!
NetCore 编写Dockerfile文件
#NetCore 5.0
FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim
#NetCore 6.0
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 #运行的版本云下载的镜像一致 WORKDIR /app #要运行到容器中的目录 COPY . /app #将当前目录复制到容器中的目录 EXPOSE 5000 #需要暴露的端口,在容器外面宿主机可以访问的端口 ENV ASPNETCORE_URLS http://*:5000 ENV TZ Asia/Shanghai #设置时区 ENTRYPOINT ["dotnet","项目名.dll"] #项目名.dll
Java编写Dockerfile文件
FROM java:8 WORKDIR /app COPY . /app ## 设置环境变量 ##ENV JAVA_HOME /usr/lib/jvm/java-1.8.0-openjdk-amd64 ##ENV PATH $PATH:$JAVA_HOME/bin EXPOSE 8086 ENV ASPNETCORE_URLS http://*:8086 ENV TZ Asia/Shanghai ## 容器启动时执行的命令 ENTRYPOINT java -jar 项目.jar
打包镜像
docker build -t 镜像名称 . //当前目录一定要存在Dockerfile文件 docker build -f Dockerfile文件路径 -t 镜像名称 .
运行镜像
docker run -d -p 宿主机端口:容器端口 镜像名称 docker run -d -p 5000:5000 hellodocker.web
#运行镜像时,通过-v挂载命令挂载目录:我们发布文件只需要在本地更改然后挂载到容器中就可以
docker run -d -v /usr/local/webside/web/java_web:/app -p 8086:8086 --name javaweb2.0 f63b8fea2dae
7. 图形化管理工具Portaniner安装
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
8、提交镜像
使用docker commit 命令提交容器成为一个新的版本,
将我们操作过的容器通过commit命令提交为一个新的镜像,我们以后使用我们改过后的镜像即可
docker commit -m=“提交的描述信息” -a="作者" 容器id 目标镜像名:[TAG] docker commit -m="add webapps" -a="Ethan" 2a3bf3eaa2e4 mytomcat:1.0
9、数据卷使用。
如果数据都在容器中,那么我们容器删除,数据就会丢失。--需求:数据需要持久化。
比如:MySQL容器删除了,数据就全丢失了,--需求:Msql数据可以存储在本地。
容器之间有一个数据共享的技术 Docker容器中产生的数据可以同步到本地,这就是卷技术,目录挂载,将我们容器中的目录挂载到Linux目录中
9.1使用 -v命令挂载目录:我们发布文件只需要在本地更改然后挂载到容器中就可以
docter run -it -v 宿主机目录:容器内目录 镜像ID
docker run -it -v /use/ceishi:/home centos
docker run -it \-v /use/local/webside/testDocker/HelloDocker.Web:/app \ microsoft/dotnet:latest
10、MySql同步数据
docker pull mysql:5.7 //下载MySql镜像 //运行容器的时候,需要将数据挂载到本地中 docker run -d -p 3310:3306 --restart=always -v /use/local/docker/mysql/conf:/etc/mysql -v /use/local/docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=password--name mysql01 mysql:5.7
//命令解释 //docker run -d -p 3310:3306 //宿主机端口:容器内端口 //--restart=always 启动 //-v /use/local/docker/mysql/conf:/etc/my.cnf //挂载mysql配置文件 //-v /use/local/docker/mysql/data:/var/lib/mysql //挂载mysql文件 //-e MYSQL_ROOT_PASSWORD=password//mysql 密码 /etc/mysql/conf.d mysqldump -u 用户名-p 数据库> /脚本名称.sql
登录mysql数据库
-P 端口号-h IP地址 -u root -p //然后输入密码即可
-P 3310 -h 192.168.211.128 -u root -p
11、具名挂载和匿名挂载
匿名挂载:挂载容器内部目录,不指定宿主机目录
docker run -d -P --name 名称 -v /etc/nginx 镜像ID
具名挂载:指定名称 -v juming:/etc/nginx 注意前面 -v不要加/加了表示绝对路径
docker run -d -P --name 名称 -v juming:/etc/nginx 镜像ID
所有Docker容器内的卷,如果没有指定目录的情况都在/var/lib/docker/volumes/目录中
-v 容器内路径 #匿名挂载 -v 卷名:容器内路径 #具名挂载 -v /宿主机路径:容器内路径 #指定路径挂载
12、安装rabbitMQ
docker pull rabbitmq:3.8.9-management docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 -v /usr/local/rabbitmq/data:/var/lib/rabbitmq --hostname myRabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_DEFAULT_USER=root -e RABBITMQ_DEFAULT_PASS=root 镜像名
1、需要下载 rabbitmq_delayed_meaage_exchange 插件,
下载地址:https://www.rabbitmq.com/community-plugins.html
2、将下载的文件 rabbitmq_delayed_message_exchange-3.8.0.ez放到 \plugins 文件夹中
docker cp 要拷贝的文件路径 容器名:要拷贝到容器里面对应的路径
docker cp /usr/local/software/rabbitmq_delayed_message_exchange-3.8.0.ez rabbitmq:/plugins
3、安装插件:
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
4、最后将容器打包成镜像
docker commit 8d4765292e14 rabbitmq-dev
13、Docker 网络
网络模式:
1、bridge:桥接模式 docker 默认
2、none:不配置网络
3、host:和宿主机共享网络
4、container:容器内网络连通
问题:解决两个容器间的通信,比如1个MySql容器,1个应用程序容器,两个容器需要进行通行。
解决方案
a、使用宿主机的IP地址,使用ifconfig命令查看IP地址,使用eth0下面的IP地址。
b、使用link命令,关联容器
docker run -it -d -P --name 名称 --link 容器名称 镜像名称
/etc/hosts 查看网络配置
c、使用自定义网络配置
docker network create my_net //创建一个网络 docker run -it --name 名称 --net 创建的网络 镜像ID docker inspect 网络名称 //查看配置的网络 docker exec -it 容器ID ping 容器ID //网络下面的容器都可以互相拼通 docker network connect 网络名称 容器名称
好处:不同集群使用不同的网络,相互隔离
网络连通,将容器与创建的自定义网络连通使用:docker network connect 网络名称 容器名称
14、docker-compose
a、下载docker-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
b、进入下载完成后的目录 /usr/local/bin/
chmod +x docker-compose
15、redis
docker pull redis 需要挂载redis.conf配置文件 启动redis # 设置端口 port 6379 # 是否启用AOF appendonly no # 设置密码 requirepass Q1w2e3r4 # 设置备份 RDB 单位:秒 修改次数 save 900 1 save 300 10 save 60 10000 # 设置 RDB 文件名和文件路径 dbfilename dump.rdb dir /data docker run -p 63792:6379 --name myredis -v /usr/local/redis/docker_redis/redis.conf:/etc/redis/redis.conf -v /usr/local/redis/docker_redis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes --requirepass "Q1w2e3r4" redis-cli -p 端口号 -a 密码
LInux 安装NetCore
sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm sudo yum install dotnet-sdk-5.0 sudo yum install aspnetcore-runtime-5.0
yum install dotnet-sdk-6.0
yum install aspnetcore-runtime-6.0
#卸载
yum remove dotnet-sdk-5.0
dotnet --list-sdks dotnet --list-runtimes