docker随笔

早期定义:运行你的应用不需要你的环境,他能够把你的环境和项目一起打包,所以,在移植的时候,不需要在其他设备上面配置环境

优势:

1、docker能将程序和使用软件环境直接绑定在一起

2、进程级隔离,容器独立。在一台服务器上,启用多个项目,可能会互杀冲突,而doker两进程间不会互抢资源

3、镜像 机制,便于部署

Docker与虚拟机对比:

安装:下载docker脚本

curl -fsSL get.docker.com -o get-docker.sh

sh get-docker.sh --mirror Aliyun

启动docker命令

systemctl enable docker

systemctl start docker

创建docker用户组

groupadd docker

将当前用户加入docker组

sudo usermod -aG docker $USER

测试docker安装是否正确

docker run hello-world

docker version有:服务端,客户端

docker info 展示docker详细信息

镜像 Image:定义一个镜像就代表一个软件

容器Container :一个镜像与运行一次就会生成一个容器 容器就是一个运行的软件服务

docker仓库 Respostory:存储所有软件的镜像位置(搜docker hub)

本地仓库:用来存储在使用docker过程中的相关镜像

docker 如何配置阿里云镜像加速

上阿里云官网搜

例子:

sido mkdir -p /etc/docker

并写下配置

sudo tee /etc/docker/daemon.json <<- 'EOF'

{

        "regostru-mirrors':["https://lz2nib3q.mirror.aliyuncs.com"]

}

EOF

重启docker

sudo systemctl daemon-reload

sudo systemctl restart docker

docker的执行命令:docker run hello-world 

如果在本地仓库找不到,则会去中心仓库拉取

如存在,则直接运行

docker version

docker info 详细信息

docker --help 用来帮助信息

镜像 image

查看当前本地仓库中存在哪些镜像

docker images 或者 docker image ls

拉取一个镜像

docker pull 镜像名称

例如:docker pull redis == docker pull redis:lastest(最新版本)

搜索镜像    docker search 镜像名

删除镜像 docker image rm 镜像名(name | tag)镜像id

强制删除 docker image rm -f 镜像名(name:tag)

docker images -q 列出所有 id

docker image rm -f $(docker images xxx -q) 批量删除

使用docker命令是对容器的操作

查看docker引擎中在运行的容器

docker ps

docker ps 查看当前docker引擎中正在运行的容器

docker run xxx|xxx  -d -name xxx  以name 运行在后台

注意:docker是操作系统层面的隔离,所以要把docker容器暴露给宿主机

所以在运行容器时,

docker run -p 8080(宿主机):8080容器内端口  镜像名:8.0

运行tomcat容器,同事设置容器与宿主机端口的隐射关系 -p

能够映射多个端口 -p xxx:xxx -p xxx:xxx

建议:运行tomcat,开放端口映射,后台启动该服务,指定容器名称 --name 容器名称

docker run -d -p xxx:xxx --name xxx   容器名称

停止重启暂停恢复容器

停止docker stop xxxxid

启动docker start 容器id|容器名称

重启 docker restart 容器id|容器名称

暂停docker pause 容器id|容器名称

恢复docker unpause 容器id|容器名称

docker ps -aq 查看所有的容器id

杀死容器

docker kill 容器id

删除容器

docker rm (-f) 容器id:

docker logs 容器id|容器名称

docker logs -f 容器id|容器名称  持续时间

进入容器内部

docker exec -it(交互模式) 容器id|name  bash(sh)

将容器中的指定文件和目录拷贝到宿主机上 docker cp  容器id:容器中文件或目录 主机哪个目录

将主机中的指定文件和目录拷贝到容器内: docker cp 主机文件和目录 容器:容器路径

查看容器内运行进程 docker top 容器id|name

查看容器内细节指令 docker inspect 容器id|name

容器数据卷机制:数据卷 Data Volume 作用: 用来实现容器中数据和宿主机中数据进行映射的(同步的)类似共享文件夹宿主机与docker进行映射

注意:数据卷使用必须在容器首次启动时设置

使用: docker run -v 宿主机目录:容器内目录 ..

①使用绝对路径设置数据卷 docker run -v  宿主机绝对路径:容器内路径

注意:这种方式会将容器路径的原始内容全部清空,始终以宿主机路径为主

如何将容器打包成一个新的镜像

docker commit -m "deploy test project in webapps" -a "xiaochen" 容器id|name tomcat-test:8.0

镜像备份和恢复

备份镜像: docker save 镜像名:Tag -o () docker save tomcat:8.0 -o tomcat-8.0.tar

恢复:docker load -i tomcat-8.0.tar

删除全部的docker容器 docker rm -f $(docker ps -qa)

镜像原理:

镜像可执行的独立软件包,它包括运行某个软件所需的所有内容,包括代码、运行环境、库、配置文件。

UnionFS:联合文件系统 叠加文件系统

原理:一次同事加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包括所有底层的文件和目录。

docker 启动mysql

建议:使用任何容器都应参考dockerhub官方网站,搜索引擎(百度 google)

1、docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.6

2、docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d --name mysql01 --restart=always mysql:5.6

docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 

今后启动docker需要后台启动映射宿主机,增加数据卷数据持久化到宿主机

例如

docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 -restart=always -v /root/data:/var/lib/mysql mysql:5.6

运行mysql容器数据备份

备份全部

docker exec (mysql容器id) sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql

备份某库

docker exec (mysql容器id) sh -c 'exec mysqldump --databases 库名 -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql

备份某库结构不要数据

docker exec (mysql容器id) sh -c 'exec mysqldump --no-data --databases 库名 -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql

使用navicat提供数据备份

redis服务:5.0.12版本

与mysql类似

docker run -p 6379:6379 redis:5.0.12

启动redis 映射端口 后端启动-d 指定名称--name 总是启动 --restart=always redis:5.0.12

运行redis开启持久化  redis-server --appendonly yes

映射数据卷

docker run --name redis01 -d -p 6379:6379 --restart=always -v /root/redisdata:/data redis:5.0.12 redis-server --appendonly yes

注意:真实情况都是使用以下的这种情况

docker run --name redis01 -d -p 6379:6379 --restart=always -v /root/redisconf:/data redis:5.0.12 redis-server /data/redis.conf

配置配置文件 

redis.conf

appendonly yes

appendfilename "xx.aof"

bind 0.0.0.0

nginx

运行nginx 映射端口80   docker run -p 80:80 nginx:1.19.10

启动nginx 映射端口 后台启动 总是启动 指定名称 加载指定nginx配置启动 -v 容器(/etc/nginx/nginx.conf)

拷贝文件:docker cp 容器id:/etc/nginx/nginx.conf /root/nginxconf

docker run -p 80:80 -d --restart=always --name nginx05 -v /root/nginxconfig/nginx.conf:/etc/nginx/nginx.conf nginx:1.19.10

nginx服务器 服务器

docker run -p 8081:80 -d --restart=always --name nginx04 -v /root/html:/usr/share/nginx/html nginx:1.19.10

es

docker pull elasticsearch:6.8.10

启动es 映射端口(9200(http) 9300(tcp))

启动es 映射端口后台启动 总是启动 指定名称 通过数据卷映射数据到宿主机~~ 容器内数据存储目录(/usr/share/elasticsearch/data)

docker run -p 9200:9000 -p 9300:9300 -d --restart=always --name=es -v esdata:/usr/share/elasticsearch/data -v xxx elasticsearch:6.8.10

注意:es启动如果没有知名单机方式运行,默认使用集群方式启动,如果使用集群方式启动在启动时会出现如下错误:65530   262144  虚拟机内存不足

解决方案:在宿主机中执行如下操作

 vim /etc/sysctl.conf    

vm.max_map_count=262144

sysctl -p 是配置生效

使es数据json符合中文,需使用分词器ik,注意ik版本要与es版本一致

放入docker es 中的plugins中

kibana 也与es一致

启动kibana 开放端口(5601)

docker run -p 5601:5601 -d --name kibana --restart=always kibana:6.8.10

启动kibana 开放端口 指定kibana链接es服务(6版本以下,7版本不用指定环境)

docker run -p 5601:5601 -d --name kibana -e ELASTICSEARCH_URL=http://192.168.80.129:9200 --restart=always kibana:6.8.10

注意:默认链接就是localhost:9200 es kibana 在一台机器上

 docker 容器间的通信 网络间的使用

默认docker创建的网桥为docker0 所有的容器就链接在这上面,能通过ip进行互相通信,但是默认不能通过名称进行通信

如要用名称进行通信  如   curl  http:容器名称:xxx

需要进行自定义网桥

创建网络自定义桥

docker network create -d bridge(默认) 网络名称

查看网络 docker network ls

查看某一个网络细节

docker network inspect 网络名

删除一个网络

docker network rm 网络名

docker network prune 删除所有未被用到的网络名

运行多哥容器在指定的网络中

docker run -d --network 网络名称

docker network connect 王利明

高级数据卷 Volume

定义:用来实现宿主机和容器之间文件目录映射同步

数据卷的使用:必须在容器首次启动时指定

-v 宿主机路径:容器内路径

使用绝对路径数据卷docker run -v /root/datas:/usr/local/tomcat/webapps

使用别名方式数据卷 docker run -v bb:/usr/local/tomcat/webapps

注意:bb代表一个数据卷别名

bb这个数据别名可以存在,也可以不存在 不存在docker首次用到时自动创建

第一次使用别名时将容器中原始数据保留下来 使用绝对路径方式不会保留容器中原始数据

数据卷别名:

别名代表一个docker自身维护数据卷

1、查看所有docker维护数据卷

docker volume ls

2、查看数据卷详细内容

docker inspect 数据卷别名、网桥名称、容器名称

docker network inspect 查看网桥详细

docker volume inspect 查看数据卷详细

3、删除一个数据卷

docker volume rm 数据卷别名

4、创建一个别名数据卷

docker volume create 数据卷别名

重点1:

dockerfile

指令:

from

。。。

CMD & ENTRYPOINT

作用都是用来指定容器启动时默认执行指令

注意:CMD 指令可以存在多个 但是存在多个只有最后一个生效

使用语法

CMD & ENTRYPOINT

1) 直接命令方式

java -jar ems.jar

2)json数组方法

["java","-jar","ems.jar"]

区别是什么?

1)CMD里面命令如果在运行容器时进行覆盖

docker run 镜像:版本号 覆盖自己定义命令 ls /

2)entrypoint里面命令如果在运行容器时进行覆盖

docker run --entrypoint=覆盖指令 镜像:版本号 传递参数

如果使用

entrypotin 用来书写一个容器固定的指定

cmd 用来给entry传递参数

注意:配合使用时必须使用json数组语法

现有docker进行项目部署存在问题

1.为了完成一个完整项目势必用到n多哥容器配合完成项目中业务开发,一旦引入n多哥容器,n多个容器之间就会形成某种依赖,也就意味某个容器某些容器运行需要其他哦让其有限启动后才能正常运行

容器编排显得至关重要

2、目前这种方式使用容器,没有办法站在项目的角度将一个项目用到一组容器划分到一起,日后难点在于项目多服务器部署

项目角度管理项目用到一组容器

docker compose对docker容器集群的快速编排。

docker-compose在线安装

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

赋予权限:sudo chmod +x /usr/local/bin/docker-compose

docker-compose 第一案例

1、创建一个项目 mkdir ems

服务

项目

docker-compose模板

代表一个docker-compose项目的版本号

version:"3.8"   

service:

        tomcat:

         image: tomcat:8.0 #代表使用哪个镜像, 类似于docker run 指定的镜像名称

         ports:        #代表宿主机和容器中端口映射 类似于docker run -p 参数

         8080:8080

启动docker-compose一组服务

docker-compose up 指定这个命令必须在

 version:“3.8”

services:

 tomcat:

  container_name: tomcat01 代表给容器指定一个名称 类似于 docker run --name xxx

  image: tomcat:8.0

  ports:

   -"8080:8080"

 redis:

  image: redis:5.6

  ports:

   - "6379:6379"

 mysql:

   image: mysql:5.6

   ports:

    - "3306:3306"

  environment:

   - "MYSQL_ROOT_PASSWORD=123456"

  volumes:

   - /root/mysqldata1:/var/lib/mysql      #代表给当前容器和宿主机指定数据卷 类似 docker run -v 

在docker-compose中必须提前创建数据卷才能使用

取别名

volumes:

 - mydata:/var/lib/mysql

volumes:

  mydata:

docker-compose 模板命令

build指令:通过docker-compose在启动容器之前现根据dockerfile构建镜像,然后根据构建镜像启动容器

command 指令 覆盖容器启动后默认执行的命令

depend_on 

        - tomcat #书写依赖的服务名

注意:服务不会等待被依赖服务完全启动才启动

environment  用来给容器启动指定环境变量

env_file 环境变量指定环境变量文件,同上私密

env_file:

 - ./aa.env

expose(使用dockerfile暴露)

image 指定启动容器使用镜像是谁 相当于docker run image(镜像名)

networks 用阿里只能大概启动容器使用网桥 相当于docker run --network

使用networks需要进行声明

ports:  用来指定宿主机和容器端口映射 docker run -p

volumes: 用来指定宿主机中容器目录映射  docker run -v

restart:   用来指定docker容器(服务)总是运行 docker run --restart=always

docker-compose 命令的基本使用

docker-compose -f docker-compose.yml  命令 [选项] [服务id]

docker-compose up 运行整个项目

up 服务id  运行服务

down  关闭所有并移除网络

down 服务id

docker-compose ps

-q 服务id

docker-compose exec 服务id bash

restart

docker-compose restart 对整个项目操作

docker-compose restart -t 服务id

rm

docker-compose rm 服务id

top 服务id  查看整个项目中的进行

pause暂停 和unpause 恢复

logs

docker-compose logs -f(实时) 服务id

查看运行日志

portainer docker 可视化界面

第三方开源项目,用来对docker引擎中运行所有容器进行可视化的展示

docker pull portainer/portainer

docker volume create portainer_data

如何使用:

docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

舒崇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值