暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

docker​学习笔记

一个小红客a3uRa 2021-03-21
669

不全 很基础的,跟着几个视频又温习了一遍 也学到了一些之前没用过的几个地方,目前ctf web方向越来越麻烦 exp越写越长 搭建复杂的环境也麻烦的一批 建议深入学习参考官方文档

https://www.bilibili.com/video/BV1og4y1q7M4

https://www.bilibili.com/video/BV1kv411q7Qc



docker

  • 传统虚拟机与docker

  • docker底层原理

  • docker基础

  • docker加速

  • docker例子

    • docker es

    • docker mysql

    • docker redis

  • portainer 图形化管理docker

  • docker网络

  • docker compose

    • yml 搭建wp博客

  • docker swarm

  • Dockerfile

  • docker stack

  • docker secret

  • docker config

  • k8s 初窥门径

docker

https://docs.docker.com/
https://docs.docker.com/reference/

https://hub.docker.com/


传统虚拟机与docker

docker底层原理

docker基础

docker镜像,就是一个模板
container容器,理解为一个简单的linux系统
repository仓库,存放镜像的地方


docker version # 版本

docker images # 查看镜像

yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker

docker info # docker系统信息 包括镜像和容器的数量
docker --help # 帮助命令

docker images --help

REPOSITORY # 镜像的仓库
TAG # 镜像的标签
IMAGE ID # 镜像的id
CREATED # 镜像的创建时间
SIZE # 镜像大小

docker search # 搜索镜像
--filter=STARS=3000 # 搜索出来的镜像就是大于3000的

docker pull mysql
docker pull docker.io/library/mysql:latest # 真实地址

docker pull mysql:5.7

docker rmi -f $(docker images -aq) # 删除所有镜像

docker run [可选参数] image

--name "xxxx" # 容器名字
-d # 后台运行 docker容器使用后台运行 必须有一个前台进程 docker发现没有 就会自动停止
-it # 使用交互方式运行,进入容器查看内容
-p # 指定端口 -p 主机端口:容器端口 -p 8080:8080 -p ip:主机端口:容器端口

当使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。
使用 docker ps 可以看到,本地主机的 49155 被映射到了容器的 5000 端口。此时访问本机的 49155 端口即可访问容器内 web 应用提供的界面。



-v 主机目录:容器目录 # 挂载 mount


docker run -it --rm # 一般用来测试 用完就删除


docker volume ls
匿名挂载
docker run -d -P --name nginx01 -v /etc/nginx nginx
具名挂载
-v 卷名:容器内路径

docker volumn inspect 卷名

方便找到卷


docker run -it --name docker02 --volumes-from docker01

--volumes-from 继承 docker01

docker run -it --name docker02 --volums-from docker01 xxxx镜像

容器之间数据共享目录





docker stats # 查看cpu状态


docker history 容器id



docker logs
docker logs -tf --tail 10 容器id

docker top 容器id # 查看容器中进程信息

docker inspect 容器id # 查看镜像的元数据

docker exec -it 容器id bin/bash # 进入容器

docker attach 容器id # 进入容器正在执行的终端


docker cp 容器id:文件路径 主机路径 # 将容器中的文件拷贝出来



docker ps
docker ps -a
docker ps -a -n=1

docker rm 容器id
docker rm -f xxxx # 强制删除 docker ps -a也没有了
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 commit -m="提交的描述信息" -a="作者" 容器id 镜像名:xxtag # commit 镜像







docker加速

登录阿里云查看

docker例子


docker es


docker run -d --name elasticsearch01 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2

-e是增加配置


docker mysql


docker -e MYSQL_ROOT_PASSWORD=123456

目录映射 干掉容器后 数据任然存在在本主机



docker redis


for port in $(seq 1 6): \
do \
mkdir -p mydata/redis/node-${port}/conf
touch mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/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



创建集群
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

redis-cli -c
cluster info
cluster nodes
set a b

使用docker搭建集群


portainer 图形化管理docker


docker run -d -p 10112:9000 \
--restart=always -v var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer




docker网络


https://yuanmomo.net/2019/06/13/docker-network/
https://www.jianshu.com/p/e63bd5d0cc1e


https://blog.csdn.net/wejack/article/details/114268784
https://www.cnblogs.com/freephp/p/14193507.html


成功ping通



$ docker exec -it tomcat02 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1
link/ipip 0.0.0.0 brd 0.0.0.0
3: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN group default qlen 1
link/tunnel6 :: brd ::
20: eth0@if21: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:05 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.5/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever


$ docker exec -it tomcat01 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1
link/ipip 0.0.0.0 brd 0.0.0.0
3: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN group default qlen 1
link/tunnel6 :: brd ::
18: eth0@if19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever


docker run -d -P --name tomcat03 --link tomcat02 tomcat
docker exec -it tomcat03 ping tomcat02


docker network ls
docker network inspect 容器id
$ docker exec -it tomcat03 cat etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.5 tomcat02 351d3fcbb3ea
172.17.0.6 b937445da465


bridge 桥接
none 不配置网络
host 和宿主机共享网络

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

docker network inspect mynet

docker run -d -P --name tomcat-net-01 --net mynet tomcat

自定义网络 不使用--link 也可以ping通名字

docker network connect # 连接一个容器到一个网络

docekr network connect mynet tomcat01
将tomcat01 放到了 mynet网络下
一个容器两个ip



docker compose

多写多看
https://docs.docker.com/compose/compose-file/

yaml文件
docker-compose.yaml
docker-compose up
yml文件


docker-compose build
docker-compose stop
docker-compose down


version: '' # 版本
services:
服务1 web:
container_name: xxxx
depends_on: # 依赖 启动顺序
- db
- redis
images
build . # 默认当前目录下的Dockerfile
build:
dockerfile: xxxdockerfile
network
deploy:
replicas: 4
ports:
- "8888:8080"
replicas: # 副本

....
服务2 redis:
image: redis
服务3 db:
image: postgres
volumes:
networks:
configs:


yml 搭建wp博客

https://docs.docker.com/compose/wordpress/


docker-compose up -d 
docekr-compose down

docker-compose up --build # 重新构建



version: "2"

services:
db:
image: mysql:5.7 # mysql镜像
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress

wordpress:
depends_on:
- db
image: wordpress:latest # wordpress镜像
ports:
- "10113:80" # 端口映射
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}

http://127.0.0.1:10113/

asura/gsX4ViFctYwaGq0YjM


docker swarm


docker swarm
docker swarm init --advertise-addr 172.24.82.149

# 获取令牌
docker swarm join-token manager
docker swarm join-token worker


docker node ls

双主双从
raft协议

docker swarm leave

work节点用来工作
管理节点可以操作
3个主节点 >1台管理节点存活


弹性

扩缩容

docker service
docekr service create -p 8888:80 --name my-nginx nginx

docker service ps my-nginx
docker service ls
docker service inspect my-nginx
docker service update --replicas 3 my-nginx
docker service update --replicas 10 my-nginx
随机分配的
服务的高可用
docker service scale my-nginx=5
动态扩缩容
docker service rm my-nginx


网络模式
swarm
PublishMode:ingress
overlay
ingress 特殊的overlay网络 负载均衡的功能

docker network inspect ingress




Dockerfile


FROM centos

MAINYAINER xxx # 镜像是xxx写的 姓名+邮箱 xxx<xxx@qq.com>

RUN # 命令


ADD # copy文件 自动解压


WORKDIR # 镜像工作目录

VOLUME # 挂载目录

EXPOSE # 暴露端口

CMD # 这个容器启动的时候要执行的命令
CMD ["ls","-a"]
docker run 容器id ls -al
docker run 容器id -l # 这样会报错

ENTRYPOINT #
docker run 容器id -l # 不会报错
不会替换命令 是追加命令


ONBUILD #

COPY # 类似ADD

ENV # 构建的时候设置环境变量

VOLUMN ["volume01","volume02"] # 匿名挂载

CMD echo "asdasdasda"





FROM centos
MAINTAINET xxx<xxx@qq.com>
COPY readme.txt usr/local/readme.txt

ADD jdk-8u11-linux-x64.tar.gz usr/local/
ADD apache-tomcat-9.0.22.tar.gz usr/local/

RUN yum -y install vim
ENV MYPATH usr/local
WORKDIR $MYPATH

ENV JAVA_HOME usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME usr/local/apache-tomcat-9.0.22
ENV CATALINA_BASH usr/local/apache-tomcat-9.0.22
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out



docker build -f 指定文件 -t mycentos:0.1 .



docker stack

docker-compose 单机部署项目
docker stack 集群部署


docker-compose up -d wordpress.yaml

docker stack deploy xxx.yaml



docker secret

安全证书


docker config

配置

网上找案例 自己跑着玩
查看帮助文档 --help


k8s 初窥门径

https://www.kubernetes.org.cn/k8s
https://kubernetes.io/zh/

云原生
10台机器以上 优先考虑k8s了

go语言
docker是go开发的
k8s也是go
并发语言go
入门
基础语法
高级对象
如何操作数据库
框架


文章转载自一个小红客a3uRa,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论