镜像和容器
Docker中有镜像和容器的概念
镜像(Image)
: Docker将应用程序
及其运行所需要的依赖、函数库、环境、配置
等文件打包在一起称为镜像即硬盘中的文件容器(Container)
: 镜像中的应用程序运行起来并加载到内存中后形成的进程就是容器,一个镜像可以运行多个容器将来形成集群
,容器之间数据相互隔离
通过命令可以实现开机自启
: 默认情况下每次重启虚拟机我们都需要手动启动Docker
和Docker中的容器
# Docker开机自启
systemctl enable docker
# Docker容器开机自启
docker update --restart=always [容器名/容器id]
镜像命令
镜像名称完整格式[repository(镜像名)]:[tag(镜像版本)]
: 如mysql:5.7
代表5.7版本的MySQL镜像,如果镜像没有指定版本默认是latest(最新版)
- 一个镜像可以运行多个容器将来形成集群,运行的容器之间数据相互隔离
docker xx --help
命令查看命令的具体语法,以下镜像名称均表示完整格式
命令名称 | 描述 |
---|---|
docker pull 镜像名称 | 远程拉取镜像到本地 |
docker images | 查看本地拉取到的所有镜像 |
docker save -o 导出的镜像文件的路径 镜像名称 | 将本地的某个镜像导出为一个压缩包 |
docker load -i 待加载加载镜像文件的路径 | 加载指定路径的镜像文件到本地 |
docker rmi 镜像名称/镜像Id | 通过镜像名称或镜像ID删除本地文件的某个镜像 |
拉取/查看镜像
需求: 在DockerHub镜像仓库中查看Nginx镜像的名称和版本
并拉取
docker pull nginx
: 拉取最新的Nginx镜像
[root@localhost ~] docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
025c56f98b67: Pull complete
ec0f5d052824: Pull complete
cc9fb8360807: Pull complete
defc9ba04d7c: Pull complete
885556963dad: Pull complete
f12443e5c9f7: Pull complete
Digest: sha256:75263be7e5846fc69cb6c42553ff9c93d653d769b94917dbda71d42d3f3c00d3
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
docker images
: 查看拉取到的镜像
[root@localhost ~] docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 3964ce7b8458 4 days ago 142MB
导出/加载镜像
docker save/load --help
命令查看docker save
和docker load
的语法
需求: 将Nginx镜像
保存为一个压缩包
docker save -o [将镜像保存到哪个目标文件(绝对路径或相对路径),目标文件不存在则会自动创建] [本地镜像名称(包括版本)]
# 将镜像导出为一个压缩包
[root@localhost ~]docker save --help
Usage: docker save [OPTIONS] IMAGE [IMAGE...]
Save one or more images to a tar archive (streamed to STDOUT by default)
Options:
-o, --output string Write to a file, instead of STDOUT
# 将指定的镜像打包成一个压缩包
docker save -o nginx.tar nginx:latest
需求: 加载导出的nginx.tar
压缩包得到nginx镜像
docker load -i [镜像压缩文件名(绝对路径或相对路径)]
# 加载文件为一个镜像
[root@localhost ~]docker load --help
Usage: docker load [OPTIONS]
Load an image from a tar archive or STDIN
Options:
-i, --input string Read from tar archive file, instead of STDIN
-q, --quiet Suppress the load output
# 通过镜像名称/镜像Id删除本地nginx镜像(rmi是remove image的缩写)
docker rmi nginx:latest
# 运行命令加载文件得到镜像
docker load -i nginx.tar
容器命令
容器状态及其常见命令
镜像中的应用程序运行起来并加载到内存中后形成的进程就是容器,容器有运行,暂停,停止
三个状态
运行
: 进程正常运行暂停
: 进程暂停表示CPU不再执行进程,此时操作系统会将容器关联的内存暂存起来,使用unpause
命令可以恢复内存空间即让CPU继续执行程序停止
: 进程终止表示直接将进程杀死,此时会回收容器占用的内存和CPU等资源,但还会保留容器的文件系统即镜像删除
: 彻底删除一个容器包括文件系统,-f
表示强制删除运行中的容器
创建容器和启动容器的区别: 容器可以创建多个,对于停止的容器只需要再次启动不需要再次创建新的容器
命令 | 功能 |
---|---|
docker run -d --name 容器名称 -p 端口映射 镜像名称 | 根据本地某个镜像创建并运行一个容器 |
docker pause 容器ID或容器名 | 让一个运行的容器暂停 |
docker unpause 容器ID或容器名 | 让一个容器从暂停状态恢复运行 |
docker stop 容器ID或容器名 | 停止一个运行的容器 |
docker start 容器ID或容器名 | 让一个停止的容器再次运行 |
docker rm -f 容器ID或容器名 | 彻底删除一个容器,将文件系统也删除,-f 表示删除运行中的容器 |
docker ps -a | 默认只会查看所有运行的容器及状态,-a 表示all 即查看所有运行的和停止的 容器及状态 |
docker exec 容器ID或容器名 | 进入容器执行命令 |
docker logs [-f] 容器名称 | 查看容器运行日志,-f 参数表示在控制台持续输出日志 |
docker inspect 容器名称 | 查看容器的详情信息如Mounts(挂载信息),端口信息,镜像信息 |
查看所有运行的
容器及状态,格式化输出指定查询的结果字段
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
命令别名
命令的别名机制,简化命令的输入
# 第一步: 修改/root/.bashrc文件(:wq保存),root可以用~表示
vi /root/.bashrc
# 文件内容
# .bashrc
# User specific aliases and functions
# 命令别名='原始命令'
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"'
alias dis='docker images'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# 第二步: 执行":wq"保存修改的文件内容
# 第三步: 执行命令使别名生效
source /~/.bashr
创建并运行Nginx容器
docker run -d --name nginx -p 80:80 nginx
: 根据nginx镜像文件创建一个nginx容器并运行,一个镜像文件可以创建多个容器
-
docker run
: 创建并运行一个容器 -
--name
: 指定创建的容器名字要求唯一,如nginx -
-p
: 指定端口映射宿主机端口号(不能冲突):容器端口号(容器之间相互隔离所以端口可以相同)
, 因为容器是对外隔离的我们不能直接访问,需要通过访问宿主机端口转发到对应容器端口容器内端口
: 由容器内的进程决定,例如MySQL进程默认端口是3306,Nginx进程默认端口是80宿主机端口
: 可以任意指定,一般与容器内保持一致
-
-d
:后台运行容器,防止命令霸行现象 -
nginx
:创建容器时依据的镜像名称,Docker会根据这个名字先从本地搜索镜像,如果搜索不到会从DockerRegistry中
下载镜像
# 第1步去DockerHub搜索nginx镜像仓库及相关信息
# 第2步拉取Nginx镜像
docker pull nginx
# 第3步查看镜像
docker images
# 结果如下:
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 16 months ago 141MB
# 第4步创建一个Nginx容器并运行
docker run -d --name nginx -p 80:80 nginx
# 第5步查看所有运行中容器
docker ps
# 第6步访问nginx网页地址http://虚拟机地址
# 第7步停止容器
docker stop nginx
# 第8步查看所有运行中的容器
docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
# 第9步再次启动nginx容器
docker start nginx
# 第10步再次查看所有运行中的容器
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
# 第11步查看容器详细信息
docker inspect nginx
# 第12步进入容器查看容器内目录
docker exec -it nginx bash
# 第13步删除容器
docker rm nginx
# 容器运行中时需要强制删除
docker rm -f ngin
在Nginx容器内部修改文件
docker exec -it nginx bash
: 进入Nginx容器内部
docker exec
: 进入容器内部,容器内部会模拟一份阉割版的Linux文件系统,只包含镜像运行时所需的环境和配置以及文件
-it
: 给当前进入的容器创建一个标准输入/输出
终端方便我们与容器交互nginx
: 指定要进入的容器名称bash
: 指定进入容器后自动执行的命令,bash表示使用Linux终端
交互命令如cd命令
,执行exit
命令从当前容器中退出
[root@localhost ~] docker exec --help
Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
Run a command in a running container
Options:
-d, --detach Detached mode: run command in the background
--detach-keys string Override the key sequence for detaching a container
-e, --env list Set environment variables
--env-file list Read in a file of environment variables
-i, --interactive Keep STDIN open even if not attached
--privileged Give extended privileges to the command
-t, --tty Allocate a pseudo-TTY
-u, --user string Username or UID (format: <name|uid>[:<group|gid>])
-w, --workdir string Working directory inside the container
需求: 进入Nginx容器内部,在DockerHub中的Nginx镜像
页面中查找镜像的根目录,并在/usr/share/nginx/html/index.html
文件中添加内容
Nginx容器内只具备镜像所必须的系统函数库没有vi
命令,此时需要使用sed
命令替换index.html
文件的内容
# 进入nginx程序的根目录
root@310016c9b413:/ cd /usr/share/nginx/html
# 查看nginx根目录下的文件
root@310016c9b413:/usr/share/nginx/html# ls
50x.html index.html
# 替换index.html文件内容,'s#原始内容#替换内容#g'
sed -i 's#Welcome to nginx#Welcome To My Blog#g' index.html
# 设置index.html文件的编码格式
sed -i 's#<head>#<head><meta charset="utf-8">#g' index.html
应用扩展
创建并进入Redis容器
需求: 创建并运行一个Redis容器,并且支持数据持久化
第一步: 在DockerHub拉取Redis镜像,查看Redis镜像文档中的帮助信息,利用docker run
命令运行镜像得到一个Redis容器
# --appendonly yes 表示支持数据持久化
docker run -d --name myRedis -p 6379:6379 redis redis-server --appendonly yes
第二步: 进入Redis容器,并执行redis-cli
客户端命令存入num=666
# 进入redis容器
docker exec -it myRedis bash
# 执行redis-cli客户端命令
redis-cli
# 存入num=666
set num 666
# 进入容器执行redis-cli命令
docker exec -it myRedis redis-cli
创建并进入MySQL容器
-e KEY=VALUE
: 配置容器内进程运行时的一些参数,KEY和VALUE都由容器内进程决定
TZ=Asia/Shanghai
表示设置时区;MYSQL_ROOT_PASSWORD=123
表示设置MySQL默认密码
# 根据镜像创建一个MySQL容器
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
mysql
# 先进入MySQL容器,后访问MySQL客户端
docker exec -it mysql bash
mysql -uroot -p
# 直接访问MySQL客户端
docker exec -it mysql mysql -uroot -p
在容器内部使用命令直接访问MySQL客户端