仲灏小栈 仲灏小栈
首页
大前端
后端&运维
其他技术
生活
关于我
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

仲灏

诚意, 正心, 格物, 致知
首页
大前端
后端&运维
其他技术
生活
关于我
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Java

  • Docker

    • Docker 学习
      • Docker 安装及使用教程
        • 卸载 docker
        • 安装 docker
        • docker 镜像加速
      • Docker 入门教程
        • image 文件
        • 容器文件
        • 实例
        • dockerFile
      • GUI 工具
      • 常用命令汇总
        • 命令行技巧
        • 删除所有镜像
        • 停用全部运行中的容器
        • 删除所有的容器
        • 停用并删除所有容器
      • 容器地址
      • 原理
        • CNM
        • 容器内部网络空间是否与外面一致
      • docker 微服务
      • Nginx 容器教程
        • HTTP 服务
      • 映射网页目录
      • 使用的案例
      • 在使用 docker 中遇到的问题&需求
        • 问题
        • Docker 启动时的报错汇总
        • 当构建完镜像启动容器时失败
        • permission denied
        • 运行 node 项目 自动退出
        • 需求收集
        • 容器中调用宿主机 docker 命令
        • 在容器外执行某个容器内的某个命令操作
    • Docker docker-compose笔记
    • Docker 配置详解
    • mac本地挂载阿里云盘
    • docker安装并初始化
    • docker 清理
    • docker for mac 踩坑记录
    • docker 网桥bridge创建
    • 小镜像制作
  • Jenkins

  • Nacos

  • SQL

  • Nginx

  • Windows

  • Linux

  • 虚拟机

  • Git

  • 网络

  • 其他

  • 后端&运维
  • Docker
仲灏
2021-11-30
目录

Docker 学习

前言: 因为写项目时需要用到mysql postgres``mongodb``redis一些数据库 不想再自己电脑上安装这些 使用率不是很多 就想到了 docker, 无论在服务器还时自己的电脑上, 感觉 docker 更符合我的场景

# Docker 安装及使用教程 (opens new window)

# 卸载 docker

1.  先查询下 docker: yum list installed|grep docker ,然后执行卸载命令:yum -y remove docker.x86_64 docker-client.x86_64 docker-common.x86_64 2.  执行删除已存在的镜像和容器(以实际情况而定): rm -rf /var/lib/docker

# 删除相关组件
# 如果使用种方式的话,需要罗列全部使安装过的组件;
yum remove docker \
  docker-client \
  docker-client-latest \
  docker-common \
  docker-latest \
  docker-latest-logrotate \
  docker-logrotate \
  docker-selinux \
  docker-engine-selinux \
  docker-engine

# 第二种方式,使用匹配符直接删除全部
# 推荐使用第二种方式,无需罗列所有的安装组件
yum remove docker docker-*
# 删除注册的服务
rm -rf /etc/systemd/system/docker.service.d
# 删除docker工作目录
rm -rf /var/lib/docker*
rm -rf /var/run/docker*
# 删除配置文件
# 直接清空这个文件夹,下面所有配置都将被清空
rm -rf /etc/docker
#----------------------------#
# /etc/docker/daemon.json    #
# /ect/docker/key.json       #
#----------------------------#
# 查找残留的docker
rpm -qa|grep docker
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# 安装 docker

# 第一步,需要安装一些依赖组件
# 安装所需的软件包。yum-utils 提供了 yum-config-manager,
# 并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2
# 使用以下命令来获得稳定的仓库
# 阿里云源地址速度相对比较快,这里是设置源地址为阿里云的镜像仓库地址。
# yum-config-manager \
#    --add-repo \
#    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 安装 Docker Engine-Community
yum install -y docker-ce docker-ce-cli containerd.io
# 将当前用户添加到docker用户组
usermod -aG docker ${USER}
# Docker默认未启动,需要手动重启docker服务
systemctl restart docker
systemctl start docker
systemctl stop docker
# 切换当前会话到docker组
newgrp - docker
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# docker 镜像加速

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [ "https://fpr97nhz.mirror.aliyuncs.com" ]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
1
2
3
4
5
6
7
8

# Docker 入门教程 (opens new window)

# image 文件

# 列出本机的所有 image 文件。
$ docker image ls

# 删除 image 文件
$ docker image rm [imageName]
1
2
3
4
5

# 容器文件

# 列出本机正在运行的容器
$ docker container ls

# 列出本机所有容器,包括终止运行的容器
$ docker container ls --all
1
2
3
4
5

终止运行的容器文件,依然会占据硬盘空间,可以使用docker container rm (opens new window)命令删除。

$ docker container rm [containerID]
1

# 实例

首先,运行下面的命令,将 image 文件从仓库抓取到本地。

$ docker image pull library/hello-world
1

上面代码中,docker image pull是抓取 image 文件的命令。library/hello-world是 image 文件在仓库里面的位置,其中library是 image 文件所在的组,hello-world是 image 文件的名字。 由于 Docker 官方提供的 image 文件,都放在library (opens new window)组里面,所以它的是默认组,可以省略。因此,上面的命令可以写成下面这样。

$ docker image pull hello-world
1

抓取成功以后,就可以在本机看到这个 image 文件了。

$ docker image ls
1

现在,运行这个 image 文件。

$ docker container run hello-world
1

docker container run命令会从 image 文件,生成一个正在运行的容器实例。 注意,docker container run命令具有自动抓取 image 文件的功能。如果发现本地没有指定的 image 文件,就会从仓库自动抓取。因此,前面的docker image pull命令并不是必需的步骤。 如果运行成功,你会在屏幕上读到下面的输出。

$ docker container run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
... ...
1
2
3
4

输出这段提示以后,hello world就会停止运行,容器自动终止。 有些容器不会自动终止,因为提供的是服务。比如,安装运行 Ubuntu 的 image,就可以在命令行体验 Ubuntu 系统。

$ docker container run -it ubuntu bash
1

对于那些不会自动终止的容器,必须使用docker container kill (opens new window) 命令手动终止。

$ docker container kill [containID]
1

# dockerFile

# GUI 工具

推荐使用 Portainer 作为容器的 GUI 管理方案。 推荐使用 Portainer 作为容器的 GUI 管理方案。

官方地址:portainer.io/install.htm… (opens new window)

安装命令

docker volume create portainer_data > docker run -d -p ``8000``:8000 -p ``9000``:9000 --name``=``portainer --restart``=``always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce

# 常用命令汇总

# 查看docker基础信息
docker info

# 拉取镜像
docker pull <image>:<tag>

# 移除容器
docker rm <containerId>

# 移除镜像
docker rmi <imageId>

# 启动、停止、重启容器
docker stop <containerId>
docker start <containerId>
docker restart <containerId>
docker run -itd --name <imageName> -P/-p<port>:<port> <imageName> /bin/bash

# 查看docker容器
docker ps <-a>

# 打包镜像
docker tag <path>/<name> <remotePath>/<name>
docker push <remotePath>/<name>

# 登录docker
docker login <remoteIp>

# 进入容器内部
docker exec -it <containerId> /bin/bash

# 从仓库搜索镜像
docker search <imageName>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

(1)docker container start 前面的docker container run命令是新建容器,每运行一次,就会新建一个容器。同样的命令运行两次,就会生成两个一模一样的容器文件。如果希望重复使用容器,就要使用docker container start命令,它用来启动已经生成、已经停止运行的容器文件。

$ docker container start [containerID]
1

(2)docker container stop 前面的docker container kill命令终止容器运行,相当于向容器里面的主进程发出 SIGKILL 信号。而docker container stop命令也是用来终止容器运行,相当于向容器里面的主进程发出 SIGTERM 信号,然后过一段时间再发出 SIGKILL 信号。

$ bash container stop [containerID]
1

这两个信号的差别是,应用程序收到 SIGTERM 信号以后,可以自行进行收尾清理工作,但也可以不理会这个信号。如果收到 SIGKILL 信号,就会强行立即终止,那些正在进行中的操作会全部丢失。 (3)docker container logs docker container logs命令用来查看 docker 容器的输出,即容器里面 Shell 的标准输出。如果docker run命令运行容器的时候,没有使用-it参数,就要用这个命令查看输出。

$ docker container logs [containerID]
1

(4)docker container exec docker container exec命令用于进入一个正在运行的 docker 容器。如果docker run命令运行容器的时候,没有使用-it参数,就要用这个命令进入容器。一旦进入了容器,就可以在容器的 Shell 执行命令了。

$ docker container exec -it [containerID] /bin/bash
1

exit 容器停止退出 crtl+p+q 容器不停止退出 (5)docker container cp docker container cp命令用于从正在运行的 Docker 容器里面,将文件拷贝到本机。下面是拷贝到当前目录的写法。

$ docker container cp [containID]:[/path/to/file] .
1

# 命令行技巧

# 删除所有镜像

docker rmi -f $(docker images -qa)

# 停用全部运行中的容器

docker stop $(docker ps -q)

# 删除所有的容器

docker rm $(docker ps -aq)

# 停用并删除所有容器

docker stop $(docker ps -q) & docker rm $(docker ps -aq)

  • 删除所有为运行的容器 使用 linux 命令

    • docker container ls -f status-exited | awk '${print$1}' | awk 'NR>1' | xargs docker container rm
  • 批量启动容器 使用 docker 命令

    • docker container ls -q -f status=created 查找所有状态为 created 的容器 并获取其 ID
    • docker container start $(docker container ls -q -f status=created)

# 容器地址

inspect -f '{ {.Name}} - { {range .NetworkSettings.Networks} }{ {.IPAddress} }{ {end} }' $(docker ps -aq)

image-20211209191006780

#

#

# 原理

# CNM

image.png CNM Drivers image.png

# 容器内部网络空间是否与外面一致

在容器外ip a 查看容器内所有ip:``docker container exec ${containerName} ip a

#

#

# docker 微服务

#


# Nginx 容器教程 (opens new window)

# HTTP 服务

Nginx 的最大作用,就是搭建一个 Web Server。有了容器,只要一行命令,服务器就架设好了,完全不用配置。

$ docker container run \
  -d \
  -p 127.0.0.1:8080:80 \
  --rm \
  --name mynginx \
  nginx
1
2
3
4
5
6

上面命令下载并运行官方的 Nginx image (opens new window),默认是最新版本(latest),当前是 1.13.9。如果本机安装过以前的版本,请删掉重新安装,因为只有 1.13.9 才开始支持 server push。 上面命令的各个参数含义如下。

  • -d:在后台运行
  • -p :容器的80端口映射到127.0.0.1:8080
  • --rm:容器停止运行后,自动删除容器文件
  • --name:容器的名字为mynginx

# 映射网页目录

网页文件都在容器里,没法直接修改,显然很不方便。下一步就是让网页文件所在的目录/usr/share/nginx/html映射到本地。 首先,新建一个目录,并进入该目录。

$ mkdir nginx-docker-demo
$ cd nginx-docker-demo
1
2

然后,新建一个html子目录。

$ mkdir html
1

在这个子目录里面,放置一个index.html文件,内容如下。

<h1>Hello World</h1>
1

接着,就可以把这个子目录html,映射到容器的网页文件目录/usr/share/nginx/html。

$ docker container run \
  -d \
  -p 127.0.0.1:8080:80 \
  --rm \
  --name mynginx \
  --volume "$PWD/html":/usr/share/nginx/html \
  nginx
1
2
3
4
5
6
7

打开浏览器,访问 127.0.0.1:8080,应该就能看到 Hello World 了。

# 使用的案例

  • 创建 mysql5.7
    • docker run -p 33306:3306 -e MYSQL_ROOT_PASSWORD=qq164165005 --name eggmysql -d mysql:5.7

# 在使用 docker 中遇到的问题&需求

# 问题

# Docker 启动时的报错汇总 (opens new window)


  • Failed to start Docker Application Container Engine.

修改/etc/docker/daemon.json 这个文件

"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
1

  • docker.service failed.

  • Failed to restart docker.service: Unit not found.

docker.service 启动失败:Unit not found 的原因及解决办法 删除/usr/lib/systemd/system/docker.service 的[UNIT]里包含的 docker.socket,然后 systemctl daemon-reload,最后 systemctl start docker.service,发现启动成功了。 类似情况 如果是类似的情况,缺少 docker.socket,但是新版本需要 docker.socket。有两种方法可以解决该问题:

  1. 可以卸载 docker,再重新安装,即可出现 docker.socket。或者
  2. 创建一个/usr/lib/systemd/system/docker.socket 文件,然后 systemctl daemon-reload,最后 systemctl start docker.service,即可启动成功。

# 当构建完镜像启动容器时失败

  • 在最后加上 sh -c "while true; do sleep 3600; done"

  • DockerFile 最后加入 ENTRYPOINT ["sh", "-c", " exec tail -f /dev/null"]防止容器启动就退出,  用这个命令一直前台阻塞

  • 删除未启动的容器 重新构建镜像

  • 进入容器docker exec [contianerID] -it /bin/sh

查看文件类型 .sh 设置文件类型set ff="unix"

# permission denied

  • sudo docker image ls

  • sudo goupadd docker

  • sudo gpasswd -a ${USER} docker

  • sudo service docker restart

  • logout 重新登录下

# 运行 node 项目 自动退出

运行容器的时候      自动进入项目命令行交互界面敲击

docker run -it pptr-image bash
1

# 需求收集

# 容器中调用宿主机 docker 命令

https://blog.csdn.net/nanhavezhi/article/details/103079056 (opens new window) 在构建容器时加上 docker 的目录映射

-v /run/docker.sock:/var/run/docker.sock  \
-v /bin/docker:/bin/docker
1
2

# 在容器外执行某个容器内的某个命令操作

命令如下 加上-c $cmd

sudo docker exec -it $DOCKER_ID /bin/bash -c 'cd /packages/detectron && python tools/train.py'
1
上次更新: 2022/06/05, 20:31:36
springboot学习上手
Docker docker-compose笔记

← springboot学习上手 Docker docker-compose笔记→

最近更新
01
vim日常使用记录
04-02
02
滑动窗口最大值
04-02
03
有效的字母异位词
04-02
更多文章>
Theme by Vdoing | Copyright © 2021-2025 izhaong | github | 蜀ICP备2021031194号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式