目录
Docker 是一种轻量级的虚拟化容器解决方案,它利用容器来打包应用程序和其依赖项,提供了一种快速部署和运行应用程序的方式。下面是 Docker 的基本组成部分:
镜像(Image):
镜像是 Docker 容器的基础。它包含了应用程序运行所需的所有文件系统内容、库、环境变量和配置等信息。镜像可以用于创建容器实例。
容器(Container):容器是 Docker 镜像的运行实例。每个容器都是相互隔离的,可以在其中运行一个或多个应用程序。容器具有自己的文件系统、网络和进程空间,并且可以被快速创建、启动、停止和删除。
仓库(Repository):仓库是存储 Docker 镜像的地方,可以是本地主机上的仓库,也可以是远程仓库(如 Docker Hub)。用户可以从仓库中拉取镜像到本地使用,也可以将自己创建的镜像推送到仓库中供他人使用。
Docker 守护进程(Docker Daemon):Docker 守护进程是在主机上运行的后台服务,负责管理 Docker 对象,如镜像、容器、网络等。它接收来自 Docker 客户端的请求,并处理这些请求。
Docker 客户端(Docker Client):Docker 客户端是与 Docker 守护进程通信的命令行工具。用户可以通过 Docker 客户端执行各种操作,如构建镜像、运行容器、管理网络等。
网络(Network):Docker 提供了各种网络驱动程序,用于连接 Docker 容器,使它们可以相互通信。用户可以创建自定义网络并将容器连接到这些网络中,实现灵活的网络配置。
数据卷(Volume):数据卷是用于在容器之间共享数据的一种方法。它允许容器访问宿主机上的特定目录或文件,以持久化存储数据或共享文件。
以上是 Docker 的基本组成部分,它们共同构成了 Docker 的核心功能和架构。通过合理使用这些组件,可以更高效地管理和运行应用程序容器。
docker利用容器(container)独立运行的一个和一组应用,应用程序或服务运行在容器里面,容器类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例
镜像是一个静态的定义,容器是镜像运行时的实体
容器为镜像提供了一个标准的隔离的运行环境,它可以被启动、开始、停止、删除
每个容器都是相互隔离的、保证安全的平台
可以把容器看作是一个简易版的Linux环境(包括root用户权限,进程空间,用户空间和网络空间等)和运行在其中的应用程序
docker必须部署在Linux内核上,如果其他系统想部署docker就必须安装一个虚拟的Linux环境
因此,docker自带一个迷你的、微小版的Linux环境
实际的环境中,必须有镜像才能创建容器,这是根本前提
从上到下的层次关系
centos7镜像 =>
docker容器 =>
centos7.9 =>
VMware =>
Windows =>
台式机/笔记本电脑如果是Ubuntu镜像
Ubuntu镜像 =>
docker容器 =>
centos7.9 =>
VMware =>
Windows =>
台式机/笔记本电脑
- [root@localhost ~]# docker pull ubuntu
- Using default tag: latest
- latest: Pulling from library/ubuntu
- 7b1a6ab2e44d: Pull complete
- Digest: sha256:626ffe58f6e7566e00254b638eb7e0f3b11d4da9675088f4781a50ae288f3322
- Status: Downloaded newer image for ubuntu:latest
- docker.io/library/ubuntu:latest
-
- [root@localhost ~]# docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- hello-world latest d2c94e258dcb 10 months ago 13.3kB
- ubuntu latest ba6acccedd29 2 years ago 72.8MB
使用run按照镜像,生成一个个的容器实例(相当于安装的一个个的虚拟机实例),也就是鲸鱼背上的集装箱
- [root@localhost ~]# docker run --help
-
- Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
[OPTIONS] 说明
--name 容器名字 =>为容器指定一个名称,若不指定则随机分配
-d 后台运行模式,并返回容器ID,也称启动守护式容器(后台运行)-i 以交互式模式运行容器,通常与 -t 一起使用
-t 为容器重新分配一个伪输入终端,通常与 -i 一起使用
也即 启动交互式容器(前台有伪终端,等待交互)-P 随机端口映射(系统随机分配),大写P
-p 指定端口映射,小写p
-p hostPort:containerPort =>主机端口号:容器内端口号 例 -p 80:8080
容器实例是运行在docker上,访问容器实例
以redis为例,首先要指定宿主机(docker)暴露的6379端口,在docker内部找6379端口的Redis容器,即为-p 6379s:6379;左边是访问宿主机暴露的端口,右边是docker访问Redis提供的端口
直接运行
- [root@localhost ~]# docker run ubuntu
- #没有任何返回值,使用docker ps 也没有正在运行的
使用镜像centos:latest以交互式启动一个容器,在容器内执行/bin/bash命令(表示在载入容器后运行bash,docker中必须保持一个进程的运行,否则整个容器就会退出,这个就表示启动容器之后启动bash)
(Bash,Unix,shell的一种,Bash是一个命令处理器,通常运行于文本窗口,并能够执行用户直接输入的命令,Bash还能从文件中读取命令,这样的文件称为脚本)
docker run -it centos /bin/bash
-i 交互式
-t 终端
centos 镜像,没加latest,默认是最新版,否则需要加TAG
/bin/bash 放在镜像后的命令,希望以一个交互式的shell,因此使用/bin/bash
需要退出终端,直接输入exit
如果镜像关闭,使用以下命令,重新进入docker容器
docekr exec -it 容器名称(或ID) bash
[root@localhost ~]# docker ps --help
Usage: docker ps [OPTIONS]
[OPTIONS]
-a 显示全部容器,正在运行的+历史运行过的
-l 显示最近创建
-n 显示最近n个创建的容器
-q 只显示容器ID,静默模式
Docker Compose是一个用于定义和运行多个Docker容器的工具。它使用YAML文件来配置应用程序的服务、网络和卷等方面,使得在单个主机上进行部署更加简单。通过定义一个Compose文件,你可以一次性启动、停止和管理整个应用程序的多个容器。
Compose文件包含了应用程序的各种服务的配置选项,如镜像、端口映射、环境变量、卷挂载等。你只需在Compose文件中定义所需的服务和其配置,然后使用docker-compose up命令即可启动整个应用程序。此外,你还可以使用docker-compose down命令来停止和删除所有相关的容器。
- [root@localhost bin]# pwd
- /usr/local/bin
- [root@localhost bin]# curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
- % Total % Received % Xferd Average Speed Time Time Time Current
- Dload Upload Total Spent Left Speed
- 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0
- 100 12.1M 100 12.1M 0 0 5094 0 0:41:40 0:41:40 --:--:-- 5509
-
- [root@localhost bin]# ll
- total 12440
- -rw-r--r--. 1 root root 12737304 Mar 10 02:25 docker-compose
- [root@localhost bin]# chmod 777 docker-compose
-
- [root@localhost bin]# docker-compose --version
- docker-compose version 1.29.2, build 5becea4c
查看帮助
- [root@localhost ~]# docker-compose --help
- Define and run multi-container applications with Docker.
-
- Usage:
- docker-compose [-f
...] [options] [COMMAND] [ARGS...] - docker-compose -h|--help
-
- Options:
- -f, --file FILE Specify an alternate compose file (default: docker-compose.yml)
- -p, --project-name NAME Specify an alternate project name (default: directory name)
- --verbose Show more output
- --no-ansi Do not print ANSI control characters
- -v, --version Print version and exit
- -H, --host HOST Daemon socket to connect to
-
- --tls Use TLS; implied by --tlsverify
- --tlscacert CA_PATH Trust certs signed only by this CA
- --tlscert CLIENT_CERT_PATH Path to TLS certificate file
- --tlskey TLS_KEY_PATH Path to TLS key file
- --tlsverify Use TLS and verify the remote
- --skip-hostname-check Don't check the daemon's hostname against the name specified
- in the client certificate (for example if your docker host
- is an IP address)
- --project-directory PATH Specify an alternate working directory
- (default: the path of the Compose file)
-
- Commands:
- build Build or rebuild services
- bundle Generate a Docker bundle from the Compose file
- config Validate and view the Compose file
- create Create services
- down Stop and remove containers, networks, images, and volumes
- events Receive real time events from containers
- exec Execute a command in a running container
- help Get help on a command
- images List images
- kill Kill containers
- logs View output from containers
- pause Pause services
- port Print the public port for a port binding
- ps List containers
- pull Pull service images
- push Push service images
- restart Restart services
- rm Remove stopped containers
- run Run a one-off command
- scale Set number of containers for a service
- start Start services
- stop Stop services
- top Display the running processes
- unpause Unpause services
- up Create and start containers
- version Show the Docker-Compose version information
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "8080:80"
db:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: mydatabase
MYSQL_USER: user
MYSQL_PASSWORD: password
包含了两个服务:web 和 db。web 服务使用 Nginx 镜像并将容器的 80 端口映射到宿主机的 8080 端口;db 服务使用 MySQL 镜像,并设置了一些环境变量用于配置 MySQL 实例。解析:
version: 指定了 Docker Compose 文件的版本。
services: 定义了各个服务。
web 和 db 是服务的名称,可以根据实际情况自行命名。
image: 指定了服务所使用的镜像。
ports: 定义了端口映射关系,格式为 "宿主机端口:容器端口"。
environment: 设置了该服务运行时需要的环境变量,这里设置了 MySQL 的 root 密码、数据库名、用户名和密码。
- [root@localhost ~]# cd /home/
- [root@localhost home]# ll
- total 0
-
- # 创建项目目录
- [root@localhost home]# mkdir wordpress
- [root@localhost home]# vi docker-compose.yml
- [root@localhost home]# cat docker-compose.yml
- version: "3"
- services:
-
- db:
- image: mysql:8.0
- command:
- - --default_authentication_plugin=mysql_native_password
- - --character-set-server=utf8mb4
- - --collation-server=utf8mb4_unicode_ci
- volumes:
- - db_data:/var/lib/mysql
- restart: always
- environment:
- MYSQL_ROOT_PASSWORD: 123456
- MYSQL_DATABASE: wordpress
- MYSQL_USER: wordpress
- MYSQL_PASSWORD: wordpress
-
- wordpress:
- depends_on:
- - db
- image: wordpress:latest
- ports:
- - "8000:80"
- restart: always
- environment:
- WORDPRESS_DB_HOST: db:3306
- WORDPRESS_DB_USER: wordpress
- WORDPRESS_DB_PASSWORD: wordpress
- volumes:
- db_data:
-
-
启动项目
- [root@localhost home]# docker-compose up
-
- [root@localhost home]# docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- edeae04f9543 wordpress:latest "docker-entrypoint.s…" 7 minutes ago Up 7 minutes 0.0.0.0:8000->80/tcp, :::8000->80/tcp home_wordpress_1
- ebaa335a1d47 mysql:8.0 "docker-entrypoint.s…" 7 minutes ago Up 7 minutes 3306/tcp, 33060/tcp home_db_1
-
- #必须在项目目录中才能使用这个命令
- [root@localhost home]# docker-compose ps
- Name Command State Ports
- ------------------------------------------------------------------------------------------------
- home_db_1 docker-entrypoint.sh --def ... Up 3306/tcp, 33060/tcp
- home_wordpress_1 docker-entrypoint.sh apach ... Up 0.0.0.0:8000->80/tcp,:::8000->80/tcp
关闭防火墙,通过浏览器进行访问
- [root@localhost home]# systemctl stop firewalld
- [root@localhost home]# setenforce 0