Docker的学习速成(口语化加实践)

CentOS 7 上的 Docker 学习与实践

学习时间2024.10.12 - 2024.10.16

后面也会持续更新,学到新东西会在其中补充。

注意:建议按顺序食用

Linux部署形式(物理机)

购买一个机子然后配置操作系统然后再操作系统上部署应用这个过程是很慢的,并且一台机器的成本很高!并且这个机器部署mysql另一个部署nginx,资源浪费。centos和ubuntu迁移不同操作系统也不好迁移还有硬件版本不同迁移也有问题,应该被淘汰!

虚拟机的部署形式

Host Operating System 宿主机的操作系统

Hypervisor CPU必须支持虚拟化技术!

虚拟机工具(vmware)还有其他公司的虚拟机产品

虚拟机是完整的操作系统!在虚拟机中安装centos7系统然后在Linux操作系统安装许多应用

一台机器上可以运行多个操作系统!多帅哦!

但是虚拟化也是有局限性,每一个虚拟机都是一个完整操作系统,要分配系统资源,虚拟机多到一定程度,操作系统本身资源会消耗殆尽!

也就是开多了虚拟机就会卡!

 虚拟化发展史了解

 简单来说也就是虚拟机上执行的东西通过vmware翻译到宿主机计算机执行

虚拟化与容器对比

容器和虚拟机的差异

传统虚拟机,宿主机也就是比如笔记本,笔记本上的vm软件每创一个虚拟机都需要一个镜像,并且每一个虚拟机有自己的操作系统,并且虚拟机也要分宿主机的资源 

 

容器技术最好的就是直接用操作系统的内核,不需要自己创建操作系统,创一个操作系统需要占很多资源。

Docker引擎

docker pull是拉取镜像 

docker run是运行镜像  运行镜像 也就是 生成容器

docker build 是创建镜像

docker push 是推送镜像

 

下面这张图很重要

 每个容器里面都是一个小linux可以这样理解然后操作系统内核是共用的我圈起来的是Linux的文件系统

 Docker组件

 安装Docker(示例是centos7)

 删除老版本

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

centos 7有些问题得配一下

CentOS 7 yum无法使用解决方法Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=_loading mirror speeds from cached hostfile could n-优快云博客

 配置docker yum源

sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

 docker-ce docker引擎 docker-ce-cli docker引擎命令行程序 container.io docker的运行环境

docker-buildx-plugin 构建镜像的插件工具 docker-compose做批量工具一次性都安装

sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

启动docker

sudo systemctl start docker

 开机自启动docker

 sudo systemctl enable docker

 配置加速

mkdir -p /etc/docker创建docker文件夹

tee 命令在Unix和Linux系统中用于从标准输入读取数据,并将其写入标准输出以及一个或多个文件。

sudo systemctl daemon-reload重启后台进程

sudo systemctl restart docker重启docker

"registry-mirrors":["https://mirror.ccs.tencentyun.com"]修改镜像源

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{
    "registry-mirrors": [
        "https://docker.1ms.run",
        "https://hub.rat.dev",
        "https://docker.1panel.live"
    ]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

Docker 命令

运行镜像生成容器

下载镜像

 

docker拉去nginx镜像 

laster代表是最新的

docker pull nginx:laster = docker pull nginx

docker images docker的镜像 

repository 镜像名字 tag 镜像的版本

latest代表最新版本

image id 镜像唯一id

created 镜像创建时间

size 大小

docker image ls 是显示已下载镜像

docker rmi + 镜像id 也就是 image id 

 启动容器

docker stats是每秒变化的

docker stats 212是指定212这个容器的变化

流程是这样的总结一下 run -> ps 查看容器id -> start 

重启虚拟机以后直接start容器就行

 

你的就是我的,我的还是我的 

修改页面

cd是到文件夹内部  ls是显示文件夹内部东西

保存镜像

 -a 作者 -c 改变的列表 -m 提交的信息 -p 暂停容器的运行

总结一下

Docker 存储 

目录挂载

首先我们要明确一下为什么要用目录挂载

若是容器突然被删除,我们做的操作是不是都没有了!

但是如果我们在机器上留一个位置给容器把我们的操作结果放在这个位置上,容器不就随便你删除了吗?

 可能有点懵逼我画张图

 再更简单一点的说法就是两边都需要一样

 这个时候是以/app/nghtml为准但是这里面没有东西就报错了

卷映射

也还是那个问题 两个路径里面的东西必须相同

不加路径就是卷 加路径就是目录

不是哥们,这个卷去哪找啊!

 相应的我修改了这里文件容器里面也会被更改了!因为他们路径里面东西必须相等!

什么我记性不是很好!也可用命令查看

 

总结一下 

Docker 网络

自定义网络

 每次docker启动应用都会给分配一个ip

 百度的ip随时会变但是域名不会改变也就是baidu.com用域名可以稳定访问

启动的容器可以加入到mynet自定义网络中,容器的名字就可以当作主机的域名

Redis主从集群

此次镜像用的是bitnami/redis

#主节点
docker run -d -p 6379:6379 \
-v /app/rd1:/bitnami/redis/data \
-e REDIS_REPLICATION_MODE=master \
-e REDIS_PASSWORD=123456 \
--network mynet --name redis01 \
bitnami/redis

 

 

一个很经典的问题

#从节点
docker run -d -p 6380:6379 \
-v /app/rd2:/bitnami/redis/data \
-e REDIS_REPLICATION_MODE=slave \
-e REDIS_MASTER_HOST=redis01 \
-e REDIS_MASTER_PORT_NUMBER=6379 \
-e REDIS_MASTER_PASSWORD=123456 \
-e REDIS_PASSWORD=123456 \
--network mynet --name redis02 \
bitnami/redis

 Redis Desktop Manager(Redis可视化工具)安装及使用教程_redisdesk-优快云博客

数据同步!结束

mysql实践

docker run -d -p 3306:3306 \
-v /app/myconf:/etc/mysql/conf.d \
-v /app/mydata:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0.37-debian

 数据库可视化工具——HeidiSQL_heidisql官网-优快云博客

 

成功! 

Docker Compose

开源博客系统安装

首先需要知道一个概念上线(up)和我run镜像第一次启动容器一样然后启动(start)

比如重启虚拟机就直接start就行!

#启动mysql
docker run -d -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_DATABASE=wordpress \
-v mysql-data:/var/lib/mysql \
-v /app/myconf:/etc/mysql/conf.d \
--restart always --name mysql \
--network blog \
mysql:8.0

#启动wordpress
docker run -d -p 8080:80 \
-e WORDPRESS_DB_HOST=mysql \
-e WORDPRESS_DB_USER=root \
-e WORDPRESS_DB_PASSWORD=123456 \
-e WORDPRESS_DB_NAME=wordpress \
-v wordpress:/var/www/html \
--restart always --name wordpress-app \
--network blog \
wordpress:latest

 

 

 compose.yaml一键启动

Compose file reference | Docker Docs

卷名和网络都需要声明 

name: myblog
services:
  mysql:
    container_name: mysql
    image: mysql:8.0
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=123456
      - MYSQL_DATABASE=wordpress
    volumes:
      - mysql-data:/var/lib/mysql
      - /app/myconf:/etc/mysql/conf.d
    restart: always
    networks:
      - blog

  wordpress:
    image: wordpress
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: mysql
      WORDPRESS_DB_USER: root
      WORDPRESS_DB_PASSWORD: 123456
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wordpress:/var/www/html
    restart: always
    networks:
      - blog
    depends_on:
      - mysql

volumes:
  mysql-data:
  wordpress:

networks:
  blog:

 命名规则是这样的

name: myblog
services:
    networks:
      - blog
networks:
  blog:

 网络是 myblog_blog

name: myblog
services:
  mysql:
    volumes:
      - mysql-data:/var/lib/mysql
      - /app/myconf:/etc/mysql/conf.d
  wordpress:
    volumes:
      - wordpress:/var/www/html
volumes:
  mysql-data:
  wordpress:
networks:
  blog:

 卷是 myblog_wordpress 和 myblog_mysql-data

name: myblog
services:
  mysql:
    container_name: mysql

容器名是mysql因为定义了

name: myblog
services:
  wordpress:
   

容器没有定义名字则是name + services + 启动的服务数所以是 myblog-wordpress-1

 修改yaml文件

 

 这里留一个链接这位大佬讲的很详细!我都能看明白大家也可以

 Docker-Compose 入门到精通 (图解+秒懂+史上最全) - 疯狂创客圈 - 博客园 (cnblogs.com)

一键启动所有中间件

#Disable memory paging and swapping performance
sudo swapoff -a

# Edit the sysctl config file
sudo vi /etc/sysctl.conf

# Add a line to define the desired value
# or change the value if the key exists,
# and then save your changes.
vm.max_map_count=262144

# Reload the kernel parameters using sysctl
sudo sysctl -p

# Verify that the change was applied by checking the value
cat /proc/sys/vm/max_map_count

 

 准备一个 compose.yaml文件,内容如下

name: devsoft
services:
  redis:
    image: bitnami/redis:latest
    restart: always
    container_name: redis
    environment:
      - REDIS_PASSWORD=123456
    ports:
      - '6379:6379'
    volumes:
      - redis-data:/bitnami/redis/data
      - redis-conf:/opt/bitnami/redis/mounted-etc
      - /etc/localtime:/etc/localtime:ro

  mysql:
    image: mysql:8.0.31
    restart: always
    container_name: mysql
    environment:
      - MYSQL_ROOT_PASSWORD=123456
    ports:
      - '3306:3306'
      - '33060:33060'
    volumes:
      - mysql-conf:/etc/mysql/conf.d
      - mysql-data:/var/lib/mysql
      - /etc/localtime:/etc/localtime:ro

  rabbit:
    image: rabbitmq:3-management
    restart: always
    container_name: rabbitmq
    ports:
      - "5672:5672"
      - "15672:15672"
    environment:
      - RABBITMQ_DEFAULT_USER=rabbit
      - RABBITMQ_DEFAULT_PASS=rabbit
      - RABBITMQ_DEFAULT_VHOST=dev
    volumes:
      - rabbit-data:/var/lib/rabbitmq
      - rabbit-app:/etc/rabbitmq
      - /etc/localtime:/etc/localtime:ro
  opensearch-node1:
    image: opensearchproject/opensearch:2.13.0
    container_name: opensearch-node1
    environment:
      - cluster.name=opensearch-cluster # Name the cluster
      - node.name=opensearch-node1 # Name the node that will run in this container
      - discovery.seed_hosts=opensearch-node1,opensearch-node2 # Nodes to look for when discovering the cluster
      - cluster.initial_cluster_manager_nodes=opensearch-node1,opensearch-node2 # Nodes eligibile to serve as cluster manager
      - bootstrap.memory_lock=true # Disable JVM heap memory swapping
      - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m" # Set min and max JVM heap sizes to at least 50% of system RAM
      - "DISABLE_INSTALL_DEMO_CONFIG=true" # Prevents execution of bundled demo script which installs demo certificates and security configurations to OpenSearch
      - "DISABLE_SECURITY_PLUGIN=true" # Disables Security plugin
    ulimits:
      memlock:
        soft: -1 # Set memlock to unlimited (no soft or hard limit)
        hard: -1
      nofile:
        soft: 65536 # Maximum number of open files for the opensearch user - set to at least 65536
        hard: 65536
    volumes:
      - opensearch-data1:/usr/share/opensearch/data # Creates volume called opensearch-data1 and mounts it to the container
      - /etc/localtime:/etc/localtime:ro
    ports:
      - 9200:9200 # REST API
      - 9600:9600 # Performance Analyzer

  opensearch-node2:
    image: opensearchproject/opensearch:2.13.0
    container_name: opensearch-node2
    environment:
      - cluster.name=opensearch-cluster # Name the cluster
      - node.name=opensearch-node2 # Name the node that will run in this container
      - discovery.seed_hosts=opensearch-node1,opensearch-node2 # Nodes to look for when discovering the cluster
      - cluster.initial_cluster_manager_nodes=opensearch-node1,opensearch-node2 # Nodes eligibile to serve as cluster manager
      - bootstrap.memory_lock=true # Disable JVM heap memory swapping
      - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m" # Set min and max JVM heap sizes to at least 50% of system RAM
      - "DISABLE_INSTALL_DEMO_CONFIG=true" # Prevents execution of bundled demo script which installs demo certificates and security configurations to OpenSearch
      - "DISABLE_SECURITY_PLUGIN=true" # Disables Security plugin
    ulimits:
      memlock:
        soft: -1 # Set memlock to unlimited (no soft or hard limit)
        hard: -1
      nofile:
        soft: 65536 # Maximum number of open files for the opensearch user - set to at least 65536
        hard: 65536
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - opensearch-data2:/usr/share/opensearch/data # Creates volume called opensearch-data2 and mounts it to the container

  opensearch-dashboards:
    image: opensearchproject/opensearch-dashboards:2.13.0
    container_name: opensearch-dashboards
    ports:
      - 5601:5601 # Map host port 5601 to container port 5601
    expose:
      - "5601" # Expose port 5601 for web access to OpenSearch Dashboards
    environment:
      - 'OPENSEARCH_HOSTS=["http://opensearch-node1:9200","http://opensearch-node2:9200"]'
      - "DISABLE_SECURITY_DASHBOARDS_PLUGIN=true" # disables security dashboards plugin in OpenSearch Dashboards
    volumes:
      - /etc/localtime:/etc/localtime:ro
  zookeeper:
    image: bitnami/zookeeper:3.9
    container_name: zookeeper
    restart: always
    ports:
      - "2181:2181"
    volumes:
      - "zookeeper_data:/bitnami"
      - /etc/localtime:/etc/localtime:ro
    environment:
      - ALLOW_ANONYMOUS_LOGIN=yes

  kafka:
    image: 'bitnami/kafka:3.4'
    container_name: kafka
    restart: always
    hostname: kafka
    ports:
      - '9092:9092'
      - '9094:9094'
    environment:
      - KAFKA_CFG_NODE_ID=0
      - KAFKA_CFG_PROCESS_ROLES=controller,broker
      - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://0.0.0.0:9094
      - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,EXTERNAL://119.45.147.122:9094
      - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT
      - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka:9093
      - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
      - ALLOW_PLAINTEXT_LISTENER=yes
      - "KAFKA_HEAP_OPTS=-Xmx512m -Xms512m"
    volumes:
      - kafka-conf:/bitnami/kafka/config
      - kafka-data:/bitnami/kafka/data
      - /etc/localtime:/etc/localtime:ro
  kafka-ui:
    container_name: kafka-ui
    image: provectuslabs/kafka-ui:latest
    restart: always
    ports:
      - 8080:8080
    environment:
      DYNAMIC_CONFIG_ENABLED: true
      KAFKA_CLUSTERS_0_NAME: kafka-dev
      KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:9092
    volumes:
      - kafkaui-app:/etc/kafkaui
      - /etc/localtime:/etc/localtime:ro

  nacos:
    image: nacos/nacos-server:v2.3.1
    container_name: nacos
    ports:
      - 8848:8848
      - 9848:9848
    environment:
      - PREFER_HOST_MODE=hostname
      - MODE=standalone
      - JVM_XMX=512m
      - JVM_XMS=512m
      - SPRING_DATASOURCE_PLATFORM=mysql
      - MYSQL_SERVICE_HOST=nacos-mysql
      - MYSQL_SERVICE_DB_NAME=nacos_devtest
      - MYSQL_SERVICE_PORT=3306
      - MYSQL_SERVICE_USER=nacos
      - MYSQL_SERVICE_PASSWORD=nacos
      - MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
      - NACOS_AUTH_IDENTITY_KEY=2222
      - NACOS_AUTH_IDENTITY_VALUE=2xxx
      - NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789
      - NACOS_AUTH_ENABLE=true
    volumes:
      - /app/nacos/standalone-logs/:/home/nacos/logs
      - /etc/localtime:/etc/localtime:ro
    depends_on:
      nacos-mysql:
        condition: service_healthy
  nacos-mysql:
    container_name: nacos-mysql
    build:
      context: .
      dockerfile_inline: |
        FROM mysql:8.0.31
        ADD https://raw.githubusercontent.com/alibaba/nacos/2.3.2/distribution/conf/mysql-schema.sql /docker-entrypoint-initdb.d/nacos-mysql.sql
        RUN chown -R mysql:mysql /docker-entrypoint-initdb.d/nacos-mysql.sql
        EXPOSE 3306
        CMD ["mysqld", "--character-set-server=utf8mb4", "--collation-server=utf8mb4_unicode_ci"]
    image: nacos/mysql:8.0.30
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=nacos_devtest
      - MYSQL_USER=nacos
      - MYSQL_PASSWORD=nacos
      - LANG=C.UTF-8
    volumes:
      - nacos-mysqldata:/var/lib/mysql
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "13306:3306"
    healthcheck:
      test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost" ]
      interval: 5s
      timeout: 10s
      retries: 10
  prometheus:
    image: prom/prometheus:v2.52.0
    container_name: prometheus
    restart: always
    ports:
      - 9090:9090
    volumes:
      - prometheus-data:/prometheus
      - prometheus-conf:/etc/prometheus
      - /etc/localtime:/etc/localtime:ro

  grafana:
    image: grafana/grafana:10.4.2
    container_name: grafana
    restart: always
    ports:
      - 3000:3000
    volumes:
      - grafana-data:/var/lib/grafana
      - /etc/localtime:/etc/localtime:ro

volumes:
  redis-data:
  redis-conf:
  mysql-conf:
  mysql-data:
  rabbit-data:
  rabbit-app:
  opensearch-data1:
  opensearch-data2:
  nacos-mysqldata:
  zookeeper_data:
  kafka-conf:
  kafka-data:
  kafkaui-app:
  prometheus-data:
  prometheus-conf:
  grafana-data:

23. 超酷 - 一键启动所有中间件_哔哩哔哩_bilibili

这里可以观看视频继续!

总结一下

个人理解:dockerfile 和 docker compose的关系

dockerfile 创建了镜像 docker compose 服务就可以用创建的镜像

docker compose有一个工程 也就是一个文件

文件里可以有多个服务,也就是镜像。我运行多个镜像产生容器也就称为实例

Dockerfile

自定义镜像

Dockerfile reference | Docker Docs

这个是jar表下载路径

https://lark-assets-prod-aliyun.oss-cn-hangzhou.aliyuncs.com/yuque/0/2024/jar/1613913/1715925477095-a815ce61-9abd-4520-a27c-8f79f4a4961f.jar?OSSAccessKeyId=LTAI4GKnqTWmz2X8mzA1Sjbv&Expires=1728810888&Signature=f1sHyj%2Fo8IHDo11f0pYNUrF8piM%3D&response-content-disposition=attachment%3Bfilename*%3DUTF-8%27%27app.jar

 上传jar包

FROM ubuntu
可以通过RUN 来安装java环境
Docker Hub提供了java环境所以直接用FROM openjdk:17

COPY app.jar /app.jar 把app.jar放到镜像里面把镜像看成一个新的操作系统放到镜像的根目录下/app.jar

EXPOSE 8080暴露端口
注意这边EXPOSE 8080不是真的暴漏,后面run命令还是要加上-p
这个暴露端口目的是给开发人员看的 仅此而已

ENTRYPOINT ["java","-jar","/app.jar"] = ENTRYPOINT java -jar /app.jar

 

 

镜像分层存储机制(重要)

 那么nginx + mynginx 是多少兆呢? 384 还是 ?

docker image inspect nginx 

docker image inspect mynginx:v1.0

 这一层就是我们修改的页面,虽然两个镜像都是192MB但是把之前层都共用了,额外开了一些存储,看起来有多个镜像,但是他们的存储共用了。

实际上也就是192MB + 那几KB

网站显示自己名字

 注意Dockerfile首字母需要大写

docker tag修改镜像名 

总结一下

Docker生命周期

附加的一些练手和知识

Docker使用三种操作系统

为什么是117MB一般redis安装包兆数很少

发行版和linux内核

 

cat /etc/redhat-release是发行版

uname -r 是内核版本

使用不同的系统(centos)

docker pull centos:7.8.2003

docker pull ubuntu

查看当前的宿主机发行版

运行centos7.8.2003

运行容器,且进入容器内

-i 交互式命令操作 -t 开启一个终端 bash 进入容器后执行的命令

docker run -it afb bash

 exit退出容器

使用不同的系统(ubuntu)

总结一下

Docker镜像、分层原理(重点)

docker pull centos 看起来只有一个文件 因为用了union file system

Bootfs引导系统包括加载系统和linux内核(宿主机提供)

Rootfs依赖Linux内核之上是一经典的Linux系统 

docker 镜像 获取发行版底层原理是rootfs rootfs就是能完成文件的一些基础操作

也就可以把rootfs看成centos / ubuntu 

或者可以这样 docker 获取 镜像 centos 然后 rootfs 是为 centos提供服务的

这里可能有点难理解

 

个人理解:画个图加深一下理解

 

 使用分层镜像的目的

 FROM xxx是在docker file里面指定base images命令

容器修改的/etc/passwd 是修改的是容器层 镜像层是只读的这就是写时复制特性

也就是镜像层里面的东西是不会变的变得只是你添加的东西所以你需要-v利用卷组保留数据

增删改查都是在容器层进行的,没有文件就会去镜像层拿取

删除是记录了一个删除操作不会对镜像进行修改

规律是从上到下查找文件

Docker镜像存储路径

docker info | grep Root

Docker容器(详细)

下图的ping baidu.com这个就是处于前台运行状态

nohup ping baidu这个就是后台运行

这个写法,会产生多多独立的容器记录,且容器内没有程序在跑,因此挂了。

而nginx中有程序就不会挂了

容器的端口映射

后台运行nginx容器,且起个名字,且端口映射宿主机的85端口,访问到容器内的80端口

 查看容器的端口转发情况

一个小问题

DockerFile(详细)

如何使用DokcerFile

得结合下面的图看 

基础镜像 是需要的  Dockerfile第一行都是FROM

接下来安装基础环境 RUN指令是万能指令可以做任何的事

容器里面运行一个程序 需要执行指令 通过cmd运行

比如nginx的容器需要运行sh脚本 centos容器则是/bin/bash

Dockerfile指令

COPY
ADD

 1: ADD chaoge.tgz /home/ 

        RUN  linux命令(xxx修改命令)

 CMD

 看了操作系统版本就直接退出容器了

 cmd和entrypoint(面试)

# 准备一个dockerfile
# 使用最新的Ubuntu镜像作为基础镜像
FROM ubuntu:latest

RUN apt-get update
RUN apt install curl -y

# 在容器启动时获取公网IP地址
CMD ["curl", "-s", "http://ipinfo.io/ip"]

docker run my_ubuntu curl -s http://ipinfo.io/ip = CMD ["curl","-s","http://ipinfo.io/ip"]

 

 想再次传入一个参数会报错!

这个就是把docker 镜像当成一个环境,执行后面的命令

 正确的姿势是修改成ENTRYPOINT!

ARG和ENV指令

 VOLUME
问题

mount信息未显示

[知识讲解篇-99] dockerfile 参数详解之WORKDIR,VOLUME - 知乎 (zhihu.com)

采用此篇的练习三会发现mount没有信息

我上官网查看也没有关于volume相关的可能是我功力浅了

卷 |Docker 文档 --- Volumes | Docker Docs

容器内运行程序(重要)

nginx -g daemon off是前台启动 让容器hang住

常用命令(总结)

这里我就不解释了前文已经全部介绍了这里只是总结一下

不知道命令可以--help查看

docker pull redis

docker run redis

docker commit 容器id 镜像名字

docker image save centos:tag > /opt/centosTag.tgz

docker image load -i /opt/centosTag.tgz

docker run -d -p 80:80 --name app01 redis

docker run -it --rm centos bash --rm是代表容器退出时删除该容器

docker run -d --rm --name pythonv centos:7.8.2003 

docker push redis

docker build redis

sudo systemctl start docker

sudo systemctl enable docker

docker search

docker pull

docker images

docker images xxx

docker images ls

docker images -q

docker rmi

docker rm

docker rm -f $(docker ps -aq)

docker rmi $(docker images -q)

docker ps 

docker ps -aq

docker stats (容器)

docker start

docker stop

docker restart

docker logs

docker exec 

docker exec -it 容器 /bin/bash

docker commit

docker save

docker volume ls

docker volume rm xx

docker network ls

docker network rm blog

docker info

docker images inspect 镜像id

docker tag 镜像id

错误排查命令

docker info

总结

需要会活学docker

比如我有个网页,然后运行springboot 前后端 这个时候按照正常的思路我们要在电脑上安装mysql

或者oracle 但是docker 完美解决了这个问题 我可以在docker上面直接拉取一个镜像 运行镜像生成容器,然后我们很快的就有了数据库环境接下来就可以测试了!

总结一下上面所学


 Docker容器

参考文献 

01.课程简介-Docker_哔哩哔哩_bilibili

Docker - 快速通关 (3h) (yuque.com)

07_使用docker的优点_哔哩哔哩_bilibili

参考的是于超老师和尚硅谷老师的docker课程希望能帮助到大家学好docker

结束

本人基本上是个人理解加参考其他大佬的肯定有很多问题欢迎指正,我会及时修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值