100%实际操作,绝非网上资料无头脑拷贝



2022.08.17

macos下安装docker

brew install --cask --appdir=/Applications docker

docker pull xx-web:0.5.1-nolicense-test

docker tag xx-web:0.5.1-nolicense-test xx-web:0.5.1-nolicense

docker save xx-web:0.5.1-nolicense -o xx-web-05-nolicense.tar

docker load < xx-web-05-nolicense.tar

docker-compose down 停止运行的容器

docker-compose up -d 以后台的方式运行容器

1. 远程拷贝镜像

在已有完整的测试环境

62服务器://mnt/xx/sdk/daystar

在测试服务器创建

mkdir -p /mnt/xx/sdk/daystar/storage

拷贝远程服务器文件到本机

[root@master1 ~]# scp -r root@xx.62://mnt/xx/sdk/daystar/storage/* /mnt/xx/sdk/daystar/storage

# scp centos_v3.tar.gz root@xx://mnt/xx/sdk/xx/storage

2. 需要把image(镜像)提前加载到对应的node上

cd /mnt/xx/sdk/daystar/storage

加载镜像

docker load -i centos_v3.tar.gz

3. docker load 命令,可导入镜像文件 *.tar ,该文件一般由 docker save 命令进行镜像导出的

[root@k8s-test storage]# docker load -i centos_v3.tar.gz  
2653d992f4ef: Loading layer [==================================================>]  216.5MB/216.5MB
445b195a0a1e: Loading layer [==================================================>]  370.6MB/370.6MB
729bda915a8c: Loading layer [==================================================>]  130.4MB/130.4MB
811b342ff5b5: Loading layer [==================================================>]  39.32MB/39.32MB
Loaded image: centos:3

[root@k8s-test storage]# docker --version
Docker version 19.03.5, build 633a0ea
[root@k8s-test storage]# docker images|grep centos   # 查找当前系统中的images信息
centos

 

[root@node2 ~]# docker images|grep cen   # 查看当前系统中的images信息
centos     3       c8576c14679e        7 months ago        740MB
[root@node2 ~]# docker run -it centos /bin/bash   #没有加版本会报错
Unable to find image 'centos:latest' locally
docker: Error response from daemon: unknown: artifact library/centos:latest not found.
See 'docker run --help'.
[root@node2 ~]# docker run -it centos:3 /bin/bash   # 启动一个容器,需要加版本

[root@018d4afffe66 /]#     # 这里命令行形式变了,表示已经进入了一个新环境
[root@018d4afffe66 /]#

4.  安装完成后,运行下面的命令,验证是否安装成功
$ docker version
# 或者
$ docker info


Docker 需要用户具有 sudo 权限,为了避免每次命令都输入sudo,可以把用户加入 Docker 用户组(官方文档)
$ sudo usermod -aG docker $USER
Docker 是服务器----客户端架构。命令行运行docker命令的时候,需要本机有 Docker 服务。如果这项服务没有启动,可以用下面的命令启动
# service 命令的用法
$ sudo service docker start

# systemctl 命令的用法
$ sudo systemctl start docker

5. docker image文件

Docker 把应用程序及其依赖,打包在 image 文件里面。只有通过这个文件,才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例

image 是二进制文件。实际开发中,一个 image 文件往往通过继承另一个 image 文件,加上一些个性化设置而生成

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

# 删除 image 文件
$ docker image rm [imageName]

常用命令

6.

[root@single-node ~]# docker image pull library/hello-world  #将 image 文件从仓库抓取到本地

由于 Docker 官方提供的 image 文件,都放在library组里面,所以它的是默认组,可以省略。因此,上面的命令可以写成下面这样   docker image pull hello-world

Using default tag: latest
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:df5f5184104426b65967e016ff2ac0bfcd44ad7899ca3bbcf8e44e4461491a9e
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest
[root@single-node ~]# docker image ls|grep hello  抓取成功以后,就可以在本机看到这个 image 文件了
hello-world                                                  latest                          d1165f221234        5 months ago        13.3kB
[root@single-node ~]# docker container run hello-world 运行这个 image 文件

注意,docker container run命令具有自动抓取 image 文件的功能。如果发现本地没有指定的 image 文件,就会从仓库自动抓取。因此,前面的docker image pull命令并不是必需的步骤

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

7.

[root@single-node ~]# docker run --name mynginx -d nginx:latest 我们通过 docker 的两个参数 -i -t,让 docker 运行的容器实现"对话"的能力

  • -t: 在新容器内指定一个伪终端或终端

  • -i: 允许你对容器内的标准输入 (STDIN) 进行交互

Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
33847f680f63: Pull complete
dbb907d5159d: Pull complete
8a268f30c42a: Pull complete
b10cf527a02d: Pull complete
c90b090c213b: Pull complete
1f41b2f2bf94: Pull complete
Digest: sha256:8f335768880da6baf72b70c701002b45f4932acae8d574dedfddaf967fc3ac90
Status: Downloaded newer image for nginx:latest
9ef2137da1c7625797ee686e0afe9dadcae61ca4a7079395fb2c612c76a63603
[root@single-node ~]# docker run -i -t ubuntu:15.10 /bin/bash
Unable to find image 'ubuntu:15.10' locally
15.10: Pulling from library/ubuntu
7dcf5a444392: Pull complete
759aa75f3cee: Pull complete
3fa871dc8a2b: Pull complete
224c42ae46e7: Pull complete
Digest: sha256:02521a2d079595241c6793b2044f02eecf294034f31d6e235ac4b2b54ffc41f3
Status: Downloaded newer image for ubuntu:15.10

注意第二行 root@0123ce188bd8:/#,此时我们已进入一个 ubuntu15.10 系统的容器

我们尝试在容器中运行命令 cat /proc/versionls分别查看当前系统的版本信息和当前目录下的文件列表

root@bd85c1d3b8b1:/# cat /proc/version
Linux version 3.10.0-862.3.2.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) ) #1 SMP Mon May 21 23:36:36 UTC 2018 

我们可以通过运行 exit 命令或者使用 CTRL+D 来退出容器

root@32923fe8cf67:/# exit
exit

[root@single-node ~]#

注意第三行中 [root@single-node ~]# 表明我们已经退出了当前的容器,返回到当前的主机中

启动容器(后台模式)

使用以下命令创建一个以进程方式运行的容器

[root@single-node ~]# docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"

在输出中,我们没有看到期望的 "hello world",而是一串长字符

4599dfd162bbdb0bc409a49bd85d8734b5777f3878f653256e03e2d1d1b3fdd6

这个长字符串叫做容器 ID,对每个容器来说都是唯一的,我们可以通过容器 ID 来查看对应的容器发生了什么。

首先,我们需要确认容器有在运行,可以通过 docker ps 来查看:
[root@single-node ~]# docker ps|grep while
4599dfd162bb        ubuntu:15.10                                              "/bin/sh -c 'while t…"   About a minute ago   Up About a minute                       nervous_davinci

输出详情介绍:

CONTAINER ID: 容器 ID

IMAGE: 使用的镜像

COMMAND: 启动容器时运行的命令

CREATED: 容器的创建时间

STATUS: 容器状态

状态有7种:

  • created(已创建)
  • restarting(重启中)
  • running 或 Up(运行中)
  • removing(迁移中)
  • paused(暂停)
  • exited(停止)
  • dead(死亡)

PORTS: 容器的端口信息和使用的连接类型(tcp\udp)

NAMES: 自动分配的容器名称

[root@single-node ~]# docker logs
"docker logs" requires exactly 1 argument.
See 'docker logs --help'.

Usage:  docker logs [OPTIONS] CONTAINER

Fetch the logs of a container

在宿主主机内使用 docker logs 命令,查看容器内的标准输出:
[root@single-node ~]# docker logs 4599dfd162bbdb0bc409a49bd85d8734b5777f3878f653256e03e2d1d1b3fdd6 这里加的是容器id
hello world
hello world
hello world
hello world
hello world
hello world
hello world

 [root@single-node ~]# docker stop 4599dfd162bbdb0bc409a49bd85d8734b5777f3878f653256e03e2d1d1b3fdd6
4599dfd162bbdb0bc409a49bd85d8734b5777f3878f653256e03e2d1d1b3fdd6
[root@single-node ~]# docker ps|grep while
[root@single-node ~]#

8. 启动已停止运行的容器

$ docker ps -a   # 查看所有的容器命令

[root@single-node ~]# docker ps -a|grep while  # 查找某个docker进程
4599dfd162bb        ubuntu:15.10                                              "/bin/sh -c 'while t…"   14 minutes ago      Up About a minute                                 nervous_davinci

[root@single-node ~]# docker run -i -t ubuntu:15.10 /bin/bash
root@641d36a2d004:/#

9. 安装nginx

[root@single-node ~]# docker images |grep nginx
nginx         latest               08b152afcfae        2 weeks ago         133MB
registry.xx.com/base/nginx-photon        v1.9.3      c6934119da35        21 months ago       44MB
registry.xx.com/base/nginx                     1.15        53f3fd8007f7           2 years ago         109MB
registry.xx.com/base/nginx-ingress-controller    0.21.0   01bd760f276c   2 years ago      568MB
[root@single-node ~]# docker run --name nginx -p 8080:80 -d nginx
3ce6177a6e54890ff0275aae2d02f189b4fdf4784be640b9b9343b5497838000
[root@single-node ~]# netstat -nap|grep 8080
tcp        0      0 0.0.0.0:18080           0.0.0.0:*               LISTEN      26626/nginx: master
tcp        0      0 172.16.xx.xx:51700   100.119.187.201:8080    TIME_WAIT   -
tcp        0      0 127.0.0.1:42024        127.0.0.1:18080         ESTABLISHED 24809/nginx-ingress
tcp        0      0 127.0.0.1:18080        127.0.0.1:56430         TIME_WAIT   -
tcp        0      0 172.xx.xx.xx:50934   100.119.187.201:8080    TIME_WAIT   -

访问内网ipport 也就是root@的地址,端口80

(A类IP:10.0.0.0   |||   B类IP:172.16.0.0-172.32.0.0   |||   C类IP  192.168.0.0   以上三个网段都属于私有网段,也就是你说的内网)http://10.1xx.xx.xx:8080/

可以看到Welcome to nginx!的提示



参考资料 

Docker 入门教程 - 阮一峰的网络日志

Docker零基础入门指南(三):Docker Hello World_abserver的博客-CSDN博客

Docker Hello World | 菜鸟教程

Docker 的用途

Docker 的主要用途,目前有三大类

(1)提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境

(2)提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容

(3)组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构

概念

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

 “Docker” ,是指容器化技术,用于支持创建和使用 Linux® 容器

借助 Docker,您可将容器当做轻巧、模块化的虚拟机使用。同时,您还将获得高度的灵活性,从而实现对容器的高效创建、部署及复制,并能将其从一个环境顺利迁移至另一个环境,从而有助于您针对云来优化您的应用

Docker 技术使用 Linux 内核和内核功能(例如 Cgroups 和 namespaces)来分隔进程,以便各进程相互独立运行。这种独立性正是采用容器的目的所在;它可以独立运行多种进程、多个应用,更加充分地发挥基础设施的作用,同时保持各个独立系统的安全性

除了运行容器之外,Docker 技术还具备其他多项功能,包括简化用于构建容器、传输镜像以及控制镜像版本的流程

层和镜像版本控制

每个 Docker 镜像文件都包含多个层。这些层组合在一起,构成单个镜像。每当镜像发生改变时,就会创建一个新的镜像层。用户每次发出命令(例如 run 或 copy)时,都会创建一个新的镜像层

Docker 重复使用这些层来构建新容器,借此帮助加快流程构建。镜像之间会共享中间变化,从而进一步提升速度、规模以及效率。版本控制是镜像层本身自带的能力。每次发生新的更改时,您大都会获得一个内置的更改日志,实现对容器镜像的全盘管控

回滚

回滚也许是层最值得一提的功能。每个镜像都拥有多个层。举例而言,如果您不喜欢迭代后的镜像版本,完全可以通过回滚,返回之前的版本。这一功能还支持敏捷开发方法,帮助持续实施集成和部署(CI/CD),使其在工具层面成为一种现实

为了不影响别的镜像,需要自己加载centos的镜像

在/tmp文件夹下远程拷贝deployment1.yml

创建pod:  kubectl create -f deployment1.yml

[root@node1 tmp]# kubectl create -f  deployment1.yml

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐