docker常用命令
- 镜像与容器:镜像(
Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者 绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
镜像操作
## 镜像搜索
docker search centos
## 拉取镜像
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
####选项说明
Docker 镜像仓库地址:地址的格式一般是 <域名/IP>[:端口号]。默认地址是 Docker Hub(docker.io)。
仓库名:如之前所说,这里的仓库名是两段式名称,即 <用户名>/<软件名>。对于 Docker Hub,如果不给出用户名,则默认为 library,也就是官方镜像。
例如: docker pull ubuntu:18.04
## 运行
docker run -it --rm ubuntu:18.04 bash
####选项说明
-it:这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。
--rm:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 --rm 可以避免浪费空间。
ubuntu:18.04:这是指用 ubuntu:18.04 镜像为基础来启动容器。
bash:放在镜像名后的是 命令,这里我们希望有个交互式 Shell,因此用的是 bash。
##### 通过 exit 退出了这个容器
##### 列出镜像 docker image ls [tag选项 如ubuntu]
##### 镜像体积(文件系统) docker system df
##### 删除镜像 docker image rm [选项] <镜像1> [<镜像2> ...]
##### 运行镜像 docker run --name webserver -d -p 80:80 nginx
##### 进入镜像 docker exec -it webserver bash
root@3729b97e8226:/# echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
root@3729b97e8226:/# exit
exit
##### 查看容器存储层改动 docker diff webserver
##### 修改一些内容后可以将容器保存为镜像
docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]
如: docker commit \
--author "Tao Wang <twang2218@gmail.com>" \
--message "修改了默认网页" \
webserver \
nginx:v2
##### 此时可以在 docker image ls 中看到这个新定制的镜像
##### 慎用 docker commit 定制化镜像应该用dockerfile制作
## dockerfile 重点
简单例子
$ mkdir mynginx
$ cd mynginx
$ touch Dockerfile
内容为:
FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
构建镜像:
docker build -t nginx:v3 . ##注意.是指定上下文地址 不是dockerfile地址
#### 简单理解上下文 看如下命令
COPY ./package.json /app/ ##即是从宿主机上下文路径下package.json拷贝到镜像
#### dockerfile指令
COPY package.json /usr/src/app/
CMD echo $HOME
ENV VERSION=1.0 DEBUG=on NAME="Happy Feet"
......
####稍微复杂点的例子
FROM debian:stretch
RUN set -x; buildDeps='gcc libc6-dev make wget' \
&& apt-get update \
&& apt-get install -y $buildDeps \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& mkdir -p /usr/src/redis \
&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
&& make -C /usr/src/redis \
&& make -C /usr/src/redis install \
&& rm -rf /var/lib/apt/lists/* \
&& rm redis.tar.gz \
&& rm -r /usr/src/redis \
&& apt-get purge -y --auto-remove $buildDeps
容器操作
## 启动容器
docker run
####例子 docker run -it ubuntu:18.04 /bin/bash
-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i 则让容器的标准输入保持打开 -d不输出日志
## 启动已经停止的容器
docker container start 容器id/name
## 终止运行容器
docker container stop 容器id/name
docker container ls -a 命令看到已经终止的容器
## 进入容器
docker exec -it containerId /bin/sh
## 容器导出为快照
docker export containerId > ubuntu.tar
## 容器快照转为镜像
cat ubuntu.tar | docker import - test/ubuntu:v1.0
## 容器删除
docker container rm containerId
私有仓库
### docker-registry 是官方提供的工具
### 拉取镜像并运行
docker run -d \
-p 5000:5000 \
-v /opt/data/registry:/var/lib/registry \
registry
-v 指定镜像文件存放在本地的指定路径
### 打tag
docker tag ubuntu:latest 127.0.0.1:5000/ubuntu:latest
格式为 docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]
### 推送镜像
docker push 127.0.0.1:5000/ubuntu:latest
数据卷
### 创建数据卷
docker volume create my-vol
### 查看数据均
docker volume ls
### 挂载数据卷
docker run -d -P \
--name web \
# -v my-vol:/usr/share/nginx/html \
--mount source=my-vol,target=/usr/share/nginx/html \
nginx:alpine
## docker inspect web 可以查看容器挂载的数据卷信息
### 删除数据卷
docker volume rm my-vol
### 也可以直接挂载主机的目录,例子:
docker run -d -P \
--name web \
# -v /src/webapp:/usr/share/nginx/html \
--mount type=bind,source=/src/webapp,target=/usr/share/nginx/html \
nginx:alpine
docker Compose
# 重要概念
- 服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
- 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
## 简单例子
- vim app.py
from flask import Flask
from redis import Redis
app = Flask(__name__)
redis = Redis(host='redis', port=6379)
@app.route('/')
def hello():
count = redis.incr('hits')
return 'Hello World! 该页面已被访问 {} 次。\n'.format(count)
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
- vim Dockerfile
FROM python:3.6-alpine
ADD . /code
WORKDIR /code
RUN pip install redis flask
CMD ["python", "app.py"]
vim docker-compose.yml
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
运行命令:docker-compose up
### 稍微复杂的案例
https://juejin.cn/post/6844903773102587918
本文介绍了Docker的常用命令,重点包括镜像和容器的操作。镜像作为静态定义,容器是其运行实体,容器的生命周期与镜像存储层紧密关联。遵循Docker最佳实践,容器应保持无状态,数据写入应使用数据卷或绑定宿主目录以确保性能和稳定性。此外,还提到了私有仓库和docker Compose的使用。
1690

被折叠的 条评论
为什么被折叠?



