docker常用命令

本文介绍了Docker的常用命令,重点包括镜像和容器的操作。镜像作为静态定义,容器是其运行实体,容器的生命周期与镜像存储层紧密关联。遵循Docker最佳实践,容器应保持无状态,数据写入应使用数据卷或绑定宿主目录以确保性能和稳定性。此外,还提到了私有仓库和docker Compose的使用。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值