Docker 日常使用

1. Docker 安装

(1) 参考官网 https://docs.docker.com/engine/install/安装 docker 。

manjaro 安装

sudo pacman -S docker

(2) Docker 需要用户具有 sudo 权限,为了避免每次命令都输入 sudo,可以把用户加入 Docker 用户组 官方文档

# 创建 docker 用户组
sudo groupadd docker
# 将用户添加到 docker 用户组,$USER 为指定的用户,如 apache
sudo usermod -aG docker $USER
# 激活对组的更改
newgrp docker

2. 安装启动镜像

(1) 参考官网拉取镜像
https://hub.docker.com/search?q=&type=image&image_filter=official

以 Ubuntu20.04 为例安装镜像

# 启动 docker
sudo systemctl start docker
# 安装镜像
$ docker pull ubuntu:20.04
# 获取安装镜像列表
$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              20.04               1e4467b07108        2 weeks ago         73.9MB
# 启动镜像
$ docker run -it ubuntu:20.04 /bin/bash
root@adcf44f2f6cd:/# 

最后以命令行模式进入 docker 容器,容器的默认用户为 root,默认目录为 /

3. Dockerfile

3.1 以编写 JetBrainsRuntime 的运行环境为例

FROM ubuntu:20.04
RUN useradd --create-home -u 1000 apache
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN apt-get update && apt-get install -y tzdata git autoconf make build-essential libx11-dev libxext-dev \
    libxrender-dev libxtst-dev libxt-dev libxrandr-dev libcups2-dev libfontconfig1-dev libasound2-dev \
    unzip zip openjdk-11-jdk file && apt-get clean
RUN git config --global core.autocrlf input
USER apache
WORKDIR /home/apache
  • FROM ubuntu:20.04
    镜像来源于 ubuntu:20.04

  • RUN useradd --create-home -u 1000 apache
    创建用户 apache,同时创建家目录,设置 apache 用户 uid 为 1000,uid 根据运行 docker 容器的用户的 uid 而定,要保持一致,可以用id $USER获取运行用户的 uid,这样容器编辑的文件对于运行用户有同样的权限;

  • ENV TZ=Asia/Shanghai
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

    设置时区为 亚洲/上海,否则在创建镜像的过程中会要求输入时区,然后就卡住了;

  • RUN apt-get…
    安装必备的开发环境,写这么长是为了减少层级,减小镜像大小,用 apt-get 而不是 apt 是为了避免警告:
    WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

  • apt-get clean
    删除包缓存中的所有包

  • RUN git config --global core.autocrlf input
    更改 Git 处理行结束符的方式,Mac、Linux 用 input,Windows 用 false;

  • USER apache
    用 apache 用户登录;

  • WORKDIR /home/apache
    指定工作目录。

3.2 创建镜像

docker build -t jetbrainsruntime-env .
  • -t jetbrainsruntime-env
    重命名镜像为:jetbrainsruntime-env

注意:最后的点代表当前目录,建议在空目录中运行,否则在创建镜像的时候会将当前目录下的所有文件都发送,参考 关于Sending build context to Docker daemon 数据很大的问题
如果实在要这么做,可以新建一个.dockerignore文件忽略其它文件。

3.3 运行镜像

docker run -it -u 1000 -v /home/jl/dockerfile:/home/apache jetbrainsruntime-env /bin/bash
  • -i
    以交互模式运行容器;通常与 -t 同时使用,为该docker创建一个伪终端;

  • -t
    为容器重新分配一个伪输入终端;通常与 -i 同时使用,为该docker创建一个伪终端;

  • -u
    指定容器内运行用户的 uid,保持与运行容器的用户 uid 一致,这样可以保持容器内外的操作权限一致;

  • -v /home/jl/dockerfile:/home/apache
    绑定一个卷,即将物理机的 /home/jl/dockerfile 目录挂载到容器内的 /home/apache 目录;

  • /bin/bash
    表示载入容器后运行 bash,docker 中必须要保持一个进程的运行,要不然整个容器启动后就会马上 kill itself,这个 /bin/bash 就表示启动容器后启动 bash。不加也可以正常运行,是因为启动后指定的用户在/etc/passed中会默认指定 /bin/bash 或 /bin/sh。

4. 常用命令

  1. 关闭指定镜像 jetbrainsruntime-env 的所有容器
docker ps -a | grep -w jetbrainsruntime-env | awk '{print $1}' | xargs docker stop
  • docker ps -a
ONTAINER ID        IMAGE                  COMMAND             CREATED             STATUS                      PORTS               NAMES
4d8e9e130690        jd                     "/bin/bash"         12 hours ago        Up 3 minutes                                    cranky_bassi
301decc40814        jd                     "/bin/bash"         12 hours ago        Exited (100) 12 hours ago                       priceless_chatelet
241f1ca895ef        jd                     "/bin/bash"         12 hours ago        Exited (0) 12 hours ago                         vigorous_bardeen
6a335e8a6455        jd                     "/bin/bash"         12 hours ago        Exited (0) 12 hours ago                         zealous_chatelet
1c4e8c9cf47b        jd                     "/bin/bash"         12 hours ago        Exited (0) 12 hours ago                         admiring_chaplygin
115cf4a3a563        jd                     "/bin/bash"         12 hours ago        Exited (0) 12 hours ago                         sad_blackwell
533e83fda83a        jetbrainsruntime-env   "/bin/bash"         12 hours ago        Exited (0) 12 hours ago                         sad_kalam
22ea95ea079e        jetbrainsruntime-env   "/bin/bash"         12 hours ago        Exited (0) 12 hours ago                         cool_kare
54f79df5241c        jetbrainsruntime-env   "/bin/bash"         13 hours ago        Exited (0) 13 hours ago                         vigilant_pare

列出所有容器,包括未运行的

  • grep -w jetbrainsruntime-env
533e83fda83a        jetbrainsruntime-env   "/bin/bash"         12 hours ago        Exited (0) 12 hours ago                         sad_kalam
22ea95ea079e        jetbrainsruntime-env   "/bin/bash"         12 hours ago        Exited (0) 12 hours ago                         cool_kare
54f79df5241c        jetbrainsruntime-env   "/bin/bash"         13 hours ago        Exited (0) 13 hours ago                         vigilant_pare

-w:精准匹配,这句话的意思即精准匹配行内容某列为 jetbrainsruntime-env 的所有行,如果不要 -w,则会匹配所有包含该字段内容的行;

  • awk '{print $1}'
533e83fda83a
22ea95ea079e
54f79df5241c

只打印第一列的内容,即所有的 container id;

  • xargs docker stop
    xargs 捕获前面命令的输出,然后传递给 docker stop 关闭容器命令。
  1. 关闭所有容器
docker ps -aq | xargs docker stop
  • docker ps -aq
4d8e9e130690
301decc40814
241f1ca895ef
6a335e8a6455
1c4e8c9cf47b
115cf4a3a563

-a:所有容器,包含关闭的容器
-q:只显示数字IDS,即容器的 id
即获取所有容器的 id

  1. 恢复容器,可一次恢复多个
docker start $CONTAINERID,$CONTAINERID...
  1. 进入容器
# 进入容器伪终端
$ docker exec -it $CONTAINERID /bin/bash
root@4d8e9e130690:/home/apache# 
# 直接执行容器中命令
$ docker exec -it $CONTAINERID pwd
/home/apache
  1. 删除容器,可一次删除多个,在删除前要先关闭
docker rm $CONTAINERID,$CONTAINERID...
# 删除所有容器
docker ps -aq | xargs docker rm
  1. 删除镜像,可一次删除多个,在删除前要先删除容器
# image id 删除
docker rmi $IMAGEID,$IMAGEID...
# 镜像名删除
docker rmi $REPOSITORY:TAG,$REPOSITORY:TAG...
# 删除所有镜像
docker images -aq | xargs docker rmi
  1. 查看所有容器名和ip
$ docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)
/mall-admin - 172.17.0.14
/mall-portal - 172.17.0.15
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值