docker学习之路

news/2024/6/3 18:33:33 标签: docker, 运维, 容器

docker_0">1. docker学习之路

核心:隔离;
容器化技术不是模拟的一个完整的操作系统;

  1. 更快交付和部署
  2. 更便捷的升级和扩容
  3. 更简单的系统运维
  4. 更高效的计算资源利用

docker_9">1.2. docker组成

组件概念
镜像docker镜像为一个模板,可通过模板来创建容器服务;
容器独立运行一个或一组应用,通过镜像创建
仓库存放镜像

官方安装文档

#查看系统内核版本
uname -r
# 查看系统信息
cat /etc/oslist

# 卸载docker
sudo yum remove docker docker-client docker-client-latest docker-common docker-lastest docker-lastest-logrotate docker-logrotate docker-engine

sudo yum install yum-utils -y

# 配置docker镜像加速器
vim /etc/docker/daemon.json
{
"exec-opts":["native.cgroupdriver=systemd"],
"registry-mirrors":["https://kn0t2bca.mirror.aliyuncs.com"]
}

systemctl daemon-reload
systemctl restart docker 
# 更新yum软件索引包
yum makecache fast

# 安装docker-ce,docker-ce-cli,containerd.io
yum install docker-ce docker-ce-cli containerd.io

# 启动docker
systemctl start docker

# 判断安装状态
docker version

# 测试docker engine
docker run hello-world

# 查看已下载镜像
docker images


# 卸载docker engine
sudo yum remove docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker

Docker属于CS系统,Docker的守护进程运行,在主机上,通过socket从客户端访问,docker server执行收到的docker client命令;

docker 的镜像无需加载操作系统内核,避免引导,利用宿主机的操作系统,省略了加载的复杂过程;虚拟机是加载GuestOS;

Docker容器LXCVM
虚拟化类型OS虚拟化OS虚拟化硬件虚拟化
性能=物理机性能=物理机性能5-20%损耗
隔离性NS隔离NS隔离
QoSCgroup弱Cgroup弱
安全性
GuestOS只支持Linux仅支持Linux全部

docker_76">2. docker镜像命令

镜像命令
docker images-a
–digests
–format “{{.ID}} {{.Repository}} {{.Tag}} {{.Digest}} {{.CreatedSince}} {{.CreatedAt}} {{.Size}}”
–no-trunc
-q
–filter “key=value”
docker search
–filter stars=3 is-official=true
–format “{{.Name}} {{.Description}} {{.StarCount}} {{.IsOfficial}} {{.IsAutomated}}”
–limit 2 # 仅显示2条结果
–no-trunc
docker pull mysql:latest
docker rmi -f {{.ImageID}}删除指定容器,空格分隔
docker rmi -f $(docker images -aq)删除全部容器
docker images -a --digests --format="{{.ID}} {{.Repository}} {{.Tag}} {{.Size}} {{.CreatedAt}} {{.CreatedSince}}" --no-trunc
docker search  java --format "{{.Name}} {{.StarCount}} {{.IsOfficial}} {{.Description}}" --limit 2 --no-trunc
# docker pull 分层下载,联合文件系统
docker pull mysql
# 等价于
docker pull docker.io/library/mysql:latest

docker__109">3. docker 容器命令

docker pull centos

docker run [args] imageID
# args
--name="Name" # 为运行的容器指定一个名字
-d 			  #后台方式运行
-it 		  #使用交互方式运行,进入容器查看内容
-p			  #指定容器的端口 -p  0.0.0.0:主机端口:容器端口
-P			  # 随机指定端口

# e.g.
docker run -it centos /bin/bash


# 运行的容器
docker ps 
-a # 列出当前正在运行的容器+历史运行过的容器 
-n=1 # 最近运行的一个容器
-q # 仅显示容器的编号

# 容器不停止退出
docker run -it {{ImageID}}
Ctrl + P + Q

# 删除指定容器
docker rm -f {{ContainerID}}
# 删除所有容器
docker rm -f $(docker ps -aq)
docker ps -aq|xargs docker rm  

# 启动停止容器
docker restart {{ContainerID}}
docker stop {{ContainerID}}
# 强制停止容器
docker kill {{ContainerID}}  

docker__148">4. docker 日志,元数据,进程查看

# docker容器使用后台运行时,docker若发现前台无应用,则会停止该容器
docker run -itd centos

#  查看最近10条日志 -t:显示时间戳;-f持续输出
docker logs -f -t --tail 10 {{ContainerID}}

# 运行临时脚本
docker run -d centos /bin/sh -c "while true;do echo liyuan;sleep 1;done"


# 查看进程信息
docker top {{ContainerID}}

# 查看docker元数据
docker inspect {{ContainerID}}

# 进入当前容器
docker exec -it {{ContainerID}} /bin/bash

#进入容器中所指定执行的命令行
docker attach {{ContainerID}}

# 容器和宿主机间文件传输
docker cp 容器ID:容器内路径 目的主机路径

在这里插入图片描述

dockernginxtomcat_eskibana_177">5.docker部署nginx,tomcat, es+kibana

docker search nginx
docker pull nginx
# 记得开启云服务器安全组对应端口
docker run -d --name nginx01 -p 31234:80 nginx

# --rm 用完该容器就删除该容器
docker run -it --rm tomcat:9.0

# 将webapps.dist 中内容 复制到 webapps 中

# elasticsearch -e 环境变量
docker run -d --name es -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node"   -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2

# kibana
mkdir -p /data/elk/config/
vim /data/elk/config/kibana.yml 

server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://172.18.0.1:9200" ]
xpack.monitoring.ui.container.elasticsearch.enabled: true



docker run -d -p 5601:5601 -v /data/elk/config/kibana.yml:/usr/share/kibana/config/kibana.yml kibana:7.5.1


# 检查docker运行的程序耗费的资源
docker stats

docker_211">6.docker可视化界面

docker run -d -p 8088:9000 -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

docker_218">7.docker镜像讲解

镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码,运行时,库,环境变量和配置文件;

7.1.联合文件系统

UnionFS:是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录故在到同一个虚拟文件系统下,为Docker镜像基础,可通过分层来进行继承,用于基础镜像,可以制作各种具体的应用镜像;
特点:一次性加载多个文件系统,但从外部来看,只能看到一个文件系统,连个加载会将各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录;说白了就是公共用

(1)bootfs(boot file system):主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核,当boot加载完成后整个kernel都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs;

(2)rootfs(root file system): 在bootfs之上,就是典型的Linux系统的/dev, /proc, /bin, /etc 等标准目录以及文件,rootfs是各种不同操作系统发行版,如ubuntu,CentOS;容器就是一个小的虚拟机;

理解:
所有镜像均起始于一个基础镜像;

8.提交自己的镜像

docker commit -m="${message}" -a="${author}" ${containerID} ${Repository}:${version}

docker__238">9.docker 数据卷挂载

# 具名挂载
docker run -it -v ${主机内目录}:${容器内目录}:${操作权限} ${imageID}
# ro: readonly 仅可从外部挂载位置改变
# rw: readwrite

docker run -d --name nginx01 -v test:/etc/nginx:ro nginx


# 匿名挂载
docker run -it -P -v /etc/nginx nginx
# 查看所有匿名挂载卷的情况
docker volume ls
# 所有匿名卷都挂载在 /var/lib/docker/volumes 下

10.Dockerfile

FROM centos
VOLUME ["volume01","volume02"]
CMD echo "---end---"
CMD /bin/bash

docker build -f ./df-1 -t liyuan-centos:v0.0.1 .
docker run -it ${imageID} /bin/bash
# 多个容器卷之间数据同步
docker run -it --name docker01 liyuan-centos:v0.0.1
docker run -it --name docker02 --volume-from docker01 liyuan-centos:v.0.0.1

# docker01和dcker02之间的挂载卷共享数据
# --volumes-from 挂载卷之间的继承
# 多个mysql实现数据共享
docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

docker run -d -p 3311:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql5.7 

11.Dockerfile指令

命令解释
FROM基础镜像,一切从这里开始构建
MAINTAINER姓名<邮箱>
RUN镜像构建时需要运行的命令
ADD添加内容,如tomcat镜像
WORKDIR镜像工作目录
VOLUME挂载卷
EXPOSE指定暴露端口配置
CMD指定容器启动时要运行的命令,仅最后一个会生效,可被替代
ENTRYPOINT可追加命令
ONBUILD当构建一个被继承Dockerfile时,会允许ONBUILD指定的命令
COPY将宿主机上的文件拷贝到镜像中
ENV构建时设置环境变量

11.1实战


FROM centos
MAINTAINER liyuan<1987151116@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


#11.2.本地镜像构建历史
docker history ${imageID}


# dockerfile-test
FROM cetnos
CMD ["ls","-a"]

docker build -f dockerfile-test -t test:0.0.0

# CMD指定的命令会被后来追加的命令覆盖掉
# 原: ls -a 现: ls -l
docker run ${imageID} ls -l 


FROM cetnos
ENTRYPOINT ["ls","-a"]

# ENTRYPOINT 指定的命令不会被覆盖掉,会拼接到命令后面
# 原: ls -a  现: ls -al
docker run ${imageID} ls -l 
FROM centos
MAINTAINER liyuan<1987151116@qq.com>

COPY readme.txt /usr/local/readme.txt

ADD jre1.8.0_321.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/jre1.8.0_321
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.58
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.58
ENV PATH $PATH:$CATALINA_HOME/lib:$CATALINA_HOME/bin:$JAVA_HOME/bin

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



docker run -itd -p 0.0.0.0:12346:8080 --name tomcat03 -v /root/docker-tomcat/webapps:/usr/local/apache-tomcat-9.0.58/webapps -v /root/docker-tomcat/logs:/usr/local/apache-tomcat-9.0.58/logs mytomcat:v0.0.1


docker login -u yuanxi2314

docker tag mytomcat:v0.0.1 yuanxi2314/mytomcat:v0.0.1
docker push yuanxi2314/mytomcat:v0.0.1  

12.Docker网络

docker rm -f $(docker ps -aq)
docker rmi -f $(docker images)

docker会为每隔容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0桥接模式,使用 evth-pair技术;
在这里插入图片描述

12.1.evth-pair

为一堆的虚拟设备接口,通常成对出现,一端连接协议,一端彼此相连;
充当桥梁,连接各种虚拟设备
OpenStac,Docker容器间的连接,OVS的连接,都是使用evth-pair技术;
容器间的通信并不是直接连接的,而是通过宿主机的docker0网卡做一层转发;

255.255.0.1/24
表示前24位作为超网
后8位作为可分配的地址
在这里插入图片描述

docker run -itd -p 0.0.0.0:12348:8080 --link tomcat03 --link tomcat07 --name tc -v /root/docker-tomcat/webapps:/usr/local/apache-tomcat-9.0.58/webapps -v /root/docker-tomcat/logs:/usr/local/apache-tomcat-9.0.58/logs mytomcat:0.0.1


docker network ls

# 本质为host映射

在这里插入图片描述

12.2.自定义互联

网络模式解释
bridge桥接网络 docker0
none不配置
host和宿主机共享
container容器网络联通(局限大)
docker network --help
docker run -d -P --name tomca00 --net bridge tomcat

# 创建网络
docker network create --driver bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 mynet

docker network ls

# 使用自定义网络
docker run -d -P --name tc01 --net mynet mytomcat:0.0.1

docker network inspect mynet

# 自定义的网络会保留域名以及ip的映射

 
# 将容器加入到一个网络中
# 给容器添加一张虚拟网卡
docker network connect mynet tomcat01

dockerredis_425">13.docker部署redis集群

分片 + 高可用 + 负载均衡

docker network create redis --subnet 172.38.0.0/16

for port in $(seq 1 6);
do 
mkdir -p /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

docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port}\
-v /mydata/redis/node-${port}/data:/data \
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf; \


docker run -p 6371:63799 -p 16371:16379 --name redis-1 -v /mydata/redis/node-1/data:/data -v /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 

14. Docker Compose

官方文档
批量编排管理容器,定义控制多个容器
(1)定义Dockerfile
(2)定义docker-compose.yml
(3)运行 docker-compose up

version: '2.0'
services:
  web: 
    build: .
    ports: 
    - "5000:5000"
    volumes:
    - .:/code
    - v1:/var/log
    links:
    - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

docker_compose_480">14.1. 安装docker compose

sudo curl -L "https://get.daocloud.io/docker/compose/releases/dow
nload/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

docker-compose version

docker_compose_yaml_490">14.2.docker compose yaml规则

Docker Compose File 语法官方文档
e.g.搭建Wordpress开源博客

version: "3.9"
    
services:
  db:
    image: mysql:5.7
    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
    volumes:
      - wordpress_data:/var/www/html
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
volumes:
  db_data: {}
  wordpress_data: {}

15. Docker swarm

docker service create -p 8888:80 --name nginx --replicas nginx
docker service update nginx --replicas 4
docker service scale nginx=1

# 加入主节点
docker swarm join-token manager

# 加入子节点
docker swarm join-token worker

docker_swarm_539">15.2.docker swarm概念

Swarm: 集群的管理和编排;
Node: docker 节点
Service: 可在管理节点或工作节点来运行
Task: 容器内的命令

e.g.

version: "3.5"
services:
  web:
    image: example/web:1.0
    deploy:
      replicas: 4
docker service create --mode global --name hello alpine ping www.baidu.com
网络模式解释
Overlay将所有Pod互联成一个整体
Ingress特殊Overlay网络,具有负载均衡功能

15.3.Docker Stack

#单机
docker-compose up -d wordpress.yml
#集群
docker stack deploy wordpress.yml

15.4. Docker Secret

# 安全配置

15.5.Docker COnfig

# 云原生时代
# Golang


http://www.niftyadmin.cn/n/1458142.html

相关文章

android横竖屏切换问题

&#xfeff;&#xfeff;一、禁止横竖屏转换 Android横竖屏切换在手机开发中比较常见&#xff0c;很多软件在开发过程中为了避免横竖屏切换时引发不必要的麻烦&#xff0c;通常禁止掉横竖屏的切换&#xff0c; 通过在AndroidManifest.xml中设置activity中的android:screenOr…

kubernetes部署mysql主从

原因&#xff1a;官方那个mysql主从的我一直抛错&#xff0c;因此就书写了自己的mysql镜像&#xff1b; mysql密码问就是 123456 mysql默认连接数不够&#xff1b; set global max_connections500; set global mysqlx_max_connections500; --- apiVersion: v1 kind: Secret m…

仿IOS 带字母索引的滑轮控件

效果大概就是这样,右边是字母索引效果 做开发的时候&#xff0c;经常碰到产品经理设计出来的界面是参考IOS控件设计出来的 &#xff0c;比如上图效果 ios有个控件是UIPickerView 就是可以上下滑动 并有些3d效果&#xff0c;非常炫。 但是android并没有提供这样的原生控件支持…

android 搜索自动匹配关键字并且标红

这个效果主要是为了着重表现搜索关键字的 。 1. 单关键字匹配 若只需匹配 搜索内容 可以写的简单一些&#xff0c;代码如下&#xff1a; if (name ! null && name.contains(mKeyWord)) { int index name.indexOf(mKeyWord); int len mKeyWord.length(); Spanned…

Sanic、uvloop及Asyncio的局限

Sanic sanic使用基于libuv的uvloop事件循环替代python asnycio自带的事件循环替代&#xff0c;以此提高异步性能。Flask和Django是同步框架&#xff0c;Tornado、FastApi和Sanic均为异步框架&#xff0c;Sanic的性能最好。Sanic入门教程&#xff1a;Sanic&#xff1a;一款号称…

android 完美隐藏软键盘

public void hideSoftInput(Activity activity) {// 关闭软键盘if (activity.getCurrentFocus() ! null) {if (activity.getCurrentFocus().getWindowToken() ! null) {InputMethodManager inputMethodManager (InputMethodManager) activity.getSystemService(Context.INPUT_…

Picasso图片框架加载图片 使用及缓存问题

项目中用的Picasso 框架 &#xff0c;加载图片。使用很方便 而且缓存机制非常强大。 正常使用我们可以这样直接调用&#xff0c;我把方法写到一个util里面了。 调用代码如下&#xff1a; PicassoUtil.displayImage(context, Constants.U_IMG_URL, R.drawable.default, iv_icon…

如何解决Android 5.0中出现的警告:Service Intent must be explicit

有些时候我们使用Service的时需要采用隐私启动的方式&#xff0c;但是Android 5.0一出来后&#xff0c;其中有个特性就是Service Intent must be explitict&#xff0c;也就是说从Lollipop开始&#xff0c;service服务必须采用显示方式启动。而android源码是这样写的&#xff…