草庐IT

十一、Docker 其它命令

Charlie Brown 2023-03-28 原文

Docker Machine

最新版 docker 已弃用 docker-machine

Docker 官方文档已没有相关信息,如需了解可参考 https://www.runoob.com/docker/docker-machine.html

Docker Stack

Docker Compose,缺点是不能在分布式多机器上使用;Docker swarm,缺点是不能同时编排多个服务,所以才有了Docker Stack,可以在分布式多机器上同时编排多个服务。

stack 是构成特定环境中的 service 集合, 它是自动部署多个相互关联的服务的简便方法,而无需单独定义每个服务。

stack file 是一种 yaml 格式的文件,类似于 docker-compose.yml 文件,它定义了一个或多个服务,并定义了服务的环境变量、部署标签、容器数量以及相关的环境特定配置等。

Stack File 的编写

服务的各种配置已在之前的文章中介绍,只是在书写格式上有所变化

示例:使用 Stack 部署应用
[root@fedora ~]# vim stack.yml
[root@fedora ~]# cat stack.yml 
version: "3.9"
    
services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
    
  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    volumes:
      - wordpress_data:/var/www/html
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
volumes:
  db_data: {}
  wordpress_data: {}

部署 Stack

# 查看 docker stack deploy 帮助信息
[root@fedora ~]# docker stack deploy --help
Usage:  docker stack deploy [OPTIONS] STACK
Deploy a new stack or update an existing stack
Aliases:
  deploy, up

Options:
  -c, --compose-file strings   Path to a Compose file, or "-" to read from stdin
      --orchestrator string    Orchestrator to use (swarm|kubernetes|all)
      --prune                  Prune services that are no longer referenced
      --resolve-image string   Query the registry to resolve image digest and supported platforms ("always"|"changed"|"never") (default "always")
      --with-registry-auth     Send registry authentication details to Swarm agents
# 初始化 swarm 集群,进行初始化的这台机器,就是集群的管理节点
# 将 dcoker-1 初始化成为主节点
[root@dcoker-1 ~]# docker swarm init --advertise-addr 192.168.10.131

# 将 docker-2 以 worker 身份加入
[root@dcoker-2 ~]# docker swarm join --token SWMTKN-1-5qcgyboe58rc3vbp87legjqwhd1c5gk7zynalnstvwoze53aeu-66bq8qbw0g6nf4sa73uiv10up 192.168.10.131:2377
This node joined a swarm as a worker.

# 生成可以以管理者身份加入的令牌
[root@dcoker-1 ~]# docker swarm join-token manager

# 将 docker-3 以 管理者 身份加入
[root@dcoker-4 ~]# docker swarm join --token SWMTKN-1-5qcgyboe58rc3vbp87legjqwhd1c5gk7zynalnstvwoze53aeu-df3olm2lg4d8fnmes29f59q48 192.168.10.131:2377
This node joined a swarm as a manager.
# 查看各节点信息
[root@dcoker-1 ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
eksgn44obh21fkyxc2szppibm                Down      Active                          
mvl1u5xscrpsz1eyh95nw0h8d *   dcoker-1   Ready     Active         Leader           20.10.17
hxhtnvdehz9ddn15bt5no377t     dcoker-2   Ready     Active                          20.10.17
l178ccqkj63nh2m7w7z3alpkm     dcoker-3   Ready     Active         Reachable        20.10.17
# Stack 部署
[root@dcoker-1 ~]# docker stack deploy -c stack.yml wordpress
Ignoring unsupported options: restart

Creating network wordpress_default
Creating service wordpress_db
Creating service wordpress_wordpress
# 查看 Stack 列表
[root@dcoker-1 ~]# docker stack ls
NAME        SERVICES   ORCHESTRATOR
wordpress   2          Swarm
# 查看 Stack 服务列表
[root@dcoker-1 ~]# docker stack services wordpress 
ID             NAME                  MODE         REPLICAS   IMAGE              PORTS
3cjvxcuivs0u   wordpress_db          replicated   0/1        mysql:5.7          
lc6o4z8fqk5w   wordpress_wordpress   replicated   0/1        wordpress:latest   *:8000->80/tcp
# 查看 Stack 任务列表
[root@dcoker-1 ~]# docker stack ps wordpress
ID             NAME                        IMAGE              NODE       DESIRED STATE   CURRENT STATE                  ERROR                              PORTS
chlveuumpw7u   wordpress_db.1              mysql:5.7          dcoker-2   Running         Preparing about a minute ago                                      
xo2ofbsz1m94   wordpress_wordpress.1       wordpress:latest   dcoker-3   Running         Preparing about a minute ago                                      
# Stack 删除
[root@dcoker-1 ~]# docker stack rm wordpress 
Removing service wordpress_db
Removing service wordpress_wordpress
Removing network wordpress_default

Docker Secret

docker secret可以减少用户名和密码的明显显示,从而可以减少暴露密码的可能性,保证系统安全可靠。所以,docker secret可以安全存储这个密码,同时分配给特定service,使之可以有权限访问该密码的权限。

1、docker secret

[root@dcoker-1 ~]# docker secret --help

Usage:  docker secret COMMAND

Manage Docker secrets

Commands:
  create      Create a secret from a file or STDIN as content
  inspect     Display detailed information on one or more secrets
  ls          List secrets
  rm          Remove one or more secrets

2、 创建secret

(1)从标准输入创建

# # 创建secret
[root@dcoker-1 ~]# printf "my super secret password" | docker secret create my_secret -
m4tuhpbn0dar8srohbrymh01n
# # 查看secret
[root@dcoker-1 ~]# docker secret ls
ID                          NAME        DRIVER    CREATED          UPDATED
m4tuhpbn0dar8srohbrymh01n   my_secret             16 seconds ago   16 seconds ago

(2)从文件创建

# 创建文件
[root@dcoker-1 ~]# vim password_test
[root@dcoker-1 ~]# cat password_test
root12345678
# 创建secret
[root@dcoker-1 ~]# docker secret create mysql_pwd password_test
j4nk416vq74627y3dqmpulpb3
# 查看secret
[root@dcoker-1 ~]# docker secret ls
ID                          NAME        DRIVER    CREATED         UPDATED
m4tuhpbn0dar8srohbrymh01n   my_secret             3 minutes ago   3 minutes ago
j4nk416vq74627y3dqmpulpb3   mysql_pwd             9 seconds ago   9 seconds ago

(3)查看secret详细信息

[root@dcoker-1 ~]# docker secret inspect mysql_pwd 
[
    {
        "ID": "j4nk416vq74627y3dqmpulpb3",
        "Version": {
            "Index": 419
        },
        "CreatedAt": "2022-06-30T10:59:37.028518375Z",
        "UpdatedAt": "2022-06-30T10:59:37.028518375Z",
        "Spec": {
            "Name": "mysql_pwd",
            "Labels": {}
        }
    }
]

(4)删除secret 

[root@dcoker-1 ~]# docker secret rm my_secret 
my_secret
[root@dcoker-1 ~]# docker secret ls
ID                          NAME        DRIVER    CREATED              UPDATED
j4nk416vq74627y3dqmpulpb3   mysql_pwd             About a minute ago   About a minute ago

3、secret 的使用

 1.容器中的使用

[root@dcoker-1 ~]# docker service create --replicas 1 --name nginx-01 -p 80:80 --secret mysql_pwd nginx
kl1x6e1qhec87oktwds3gcmfe
overall progress: 1 out of 1 tasks 
1/1: running   [==================================================>] 
verify: Service converged 
[root@dcoker-1 ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS     NAMES
4a47192e5794   nginx:latest   "/docker-entrypoint.…"   16 seconds ago   Up 13 seconds   80/tcp    nginx-01.1.lgl33kvgpswk9qem81nk72hzh
[root@dcoker-1 ~]# docker service ls
ID             NAME                  MODE         REPLICAS   IMAGE              PORTS
kl1x6e1qhec8   nginx-01              replicated   1/1        nginx:latest       *:80->80/tcp
[root@dcoker-1 ~]# docker service ps nginx-01 
ID             NAME         IMAGE          NODE       DESIRED STATE   CURRENT STATE                ERROR     PORTS
lgl33kvgpswk   nginx-01.1   nginx:latest   dcoker-1   Running         Running about a minute ago             
# 进入service容器查看secret
[root@dcoker-1 ~]# docker exec -it 4a47192e5794 /bin/bash
root@4a47192e5794:/# cat /run/secrets/mysql_pwd 
root12345678

2.mysql容器中的使用 

# 创建mysql服务
[root@dcoker-1 ~]# docker service create --name mysql_test --secret mysql_pwd -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql_pwd mysql:5.7
ubmxlwsl8ozjabmx899ke8r6i
overall progress: 1 out of 1 tasks 
1/1: running   [==================================================>] 
verify: Service converged 
# 查看服务
[root@dcoker-1 ~]# docker service ls
ID             NAME         MODE         REPLICAS   IMAGE       PORTS
ubmxlwsl8ozj   mysql_test   replicated   1/1        mysql:5.7   
[root@dcoker-1 ~]# docker service ps mysql_test 
ID             NAME           IMAGE       NODE       DESIRED STATE   CURRENT STATE                ERROR     PORTS
6crsfvrb05ft   mysql_test.1   mysql:5.7   dcoker-2   Running         Running about a minute ago
# mysql_test服务运行在dcoker-2上
# mysql_test服务运行在dcoker-2上,在dcoker-2节点上进入容器
[root@dcoker-2 ~]# docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS                 NAMES
2a3a27d1f9cf   mysql:5.7   "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes   3306/tcp, 33060/tcp   mysql_test.1.6crsfvrb05ft16x8j652xs2y2
[root@dcoker-2 ~]# docker exec -it 2a3a27d1f9cf /bin/bash
# 查看secret
root@2a3a27d1f9cf:/# cat /run/secrets/mysql_pwd 
root12345678
# 用密码进入mysql
root@2a3a27d1f9cf:/# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.38 MySQL Community Server (GPL)
......
......

mysql> exit
Bye

3.docker-compose中的使用

(1)docker-compose.yml文件

[root@dcoker-1 ~]# ls
docker-compose.yml  password_test
[root@dcoker-1 ~]# cat password_test 
root12345678
[root@dcoker-1 ~]# cat docker-compose.yml 
version: '3.6'

services:
  mysql_test_01:
    image: mysql:5.7.32
    environment:
      MYSQL_ROOT_PASSWORD_FILE: /run/secrets/r_pwd
      MYSQL_DATABASE: mysql
      MYSQL_USER: test
      MYSQL_PASSWORD_FILE: /run/secrets/t_pwd
    secrets:
      - r_pwd
      - t_pwd
secrets:
  r_pwd:
    file: ./password_test
  t_pwd:
    file: ./password_test

(2)docker-compose 启动

[root@dcoker-1 ~]# docker compose up
[+] Running 1/0
 ⠿ Container root-mysql_test_01-1  Created                                                                     0.1s
Attaching to root-mysql_test_01-1
......
......

(3)docker stack 启动

[root@dcoker-1 ~]# docker stack deploy mysql_test_02 -c docker-compose.yml
Creating network mysql_test_default
Creating secret mysql_test_r_pwd
Creating secret mysql_test_t_pwd
Creating service mysql_test_mysql_test_01

(4)查看容器 

[root@dcoker-1 ~]# docker service ls
ID             NAME                       MODE         REPLICAS   IMAGE          PORTS
fxw4r07zmjl6   mysql_test_mysql_test_01   replicated   1/1        mysql:5.7.32   

[root@dcoker-1 ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                 NAMES
4ba751e70194   mysql:5.7.32   "docker-entrypoint.s…"   4 minutes ago   Up 4 minutes   3306/tcp, 33060/tcp   root-mysql_test_01-1

(5)进入容器

[root@dcoker-1 ~]# docker exec -it 4ba751e70194 /bin/bash
root@4ba751e70194:/# ls /run/secrets/
r_pwd  t_pwd

(6)分别用root用户和test用户登录mysql

root@4ba751e70194:/# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
.....
.....
mysql> exit
Bye
root@4ba751e70194:/# mysql -u test -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
......
......
mysql> exit
Bye

Docker Config

在集群环境中配置文件的分发,可以通过将配置文件放入镜像中、设置环境变量、挂载volume、挂载目录的方式,当然也可以通过 docker config 来管理集群中的配置文件,这样的方式也更加通用。

1.docker config

[root@dcoker-1 ~]# docker config --help

Usage:  docker config COMMAND

Manage Docker configs

Commands:
  create      Create a config from a file or STDIN
  inspect     Display detailed information on one or more configs
  ls          List configs
  rm          Remove one or more configs

2.config 创建

(1)从标准输入创建

# 创建config
[root@dcoker-1 ~]# echo "listen 80" | docker config create conf -
0jhd03b1qxouoeosfv1osqjd8
# 查看config
[root@dcoker-1 ~]# docker config ls
ID                          NAME      CREATED          UPDATED
0jhd03b1qxouoeosfv1osqjd8   conf      14 seconds ago   14 seconds ago

(2)从文件创建

# 创建文件
[root@dcoker-1 ~]# vim default.conf
[root@dcoker-1 ~]# cat default.conf 
server {
    listen       88;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}
# 创建config
[root@dcoker-1 ~]# docker config create conf2 default.conf 
kdep8819p0b3qqsmpz5nk16ks
# 查看config
[root@dcoker-1 ~]# docker config ls
ID                          NAME      CREATED              UPDATED
0jhd03b1qxouoeosfv1osqjd8   conf      About a minute ago   About a minute ago
kdep8819p0b3qqsmpz5nk16ks   conf2     6 seconds ago        6 seconds ago

(3)查看secret详细信息

[root@dcoker-1 ~]# docker config inspect conf
[
    {
        "ID": "0jhd03b1qxouoeosfv1osqjd8",
        "Version": {
            "Index": 793
        },
        "CreatedAt": "2022-07-02T19:28:28.31357504Z",
        "UpdatedAt": "2022-07-02T19:28:28.31357504Z",
        "Spec": {
            "Name": "conf",
            "Labels": {},
            "Data": "bGlzdGVuIDgwCg=="
        }
    }
]

对 conf2 进行 base64 解码

[root@dcoker-1 ~]# docker config inspect -f '{{json .Spec.Data}}' conf2 | cut -d '"' -f2 | base64 -d
server {
    listen       88;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}

(4)删除secret 

[root@dcoker-1 ~]# docker config rm conf2
conf2
[root@dcoker-1 ~]# docker config ls
ID                          NAME      CREATED         UPDATED
0jhd03b1qxouoeosfv1osqjd8   conf      9 minutes ago   9 minutes ago

3.config 使用

1、使用nginx镜像创建容器

在conf配置中,将nginx的监听端口改成了88,替换掉nginx中的默认80端口的配置文件,创建service时,将容器内部端口88端口映射成主机上90端口

[root@dcoker-1 ~]# docker service create --name nginx01 --config source=conf,target=/etc/nginx/conf.d/default.conf -p 90:88 nginx
ut4b9onwcsrv9vmf444jgq72z
overall progress: 1 out of 1 tasks 
1/1: running   
verify: Service converged 

2、测试

访问90端口,可以看到访问是成功的。

 其它命令

掌握规律,多写多看

参考官方文档进行学习

https://docs.docker.com/engine/reference/commandline/docker/

 先查看官方有关该命令的帮助信息,了解该命令的基本使用并进行尝试,最后找相关的项目进行测试。多练多思考。

有关十一、Docker 其它命令的更多相关文章

  1. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  2. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  3. ruby-on-rails - rbenv:从 RVM 移动到 rbenv 后,在 Jenkins 执行 shell 中找不到命令 - 2

    我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions

  4. ruby - 从 Ruby : capturing the output while displaying the output? 运行 shell 命令 - 2

    我有一个问题。我想从另一个ruby​​脚本运行一个ruby​​脚本并捕获它的输出信息,同时让它也输出到屏幕。亚军#!/usr/bin/envrubyprint"Enteryourpassword:"password=gets.chompputs"Hereisyourpassword:#{password}"我运行的脚本文件:开始.rboutput=`runner`putsoutput.match(/Hereisyour(password:.*)/).captures[0].to_s正如您在此处看到的那样,存在问题。在start.rb的第一行,屏幕是空的。我在运行程序中看不到“输入您的密

  5. ruby - 是否有将图像文件转换为 ASCII 艺术的命令行程序或库? - 2

    有这样的事吗?我想在Ruby程序中使用它。 最佳答案 试试这个http://csl.sublevel3.org/jp2a/此外,Imagemagick可能还有一些东西 关于ruby-是否有将图像文件转换为ASCII艺术的命令行程序或库?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6510445/

  6. ruby - 在 Ruby 的 if 语句中检查 bash 命令 - 2

    如何在Ruby的if语句中检查bash命令的返回值(true/false)。我想要这样的东西,if("/usr/bin/fswscell>/dev/null2>&1")has_afs="true"elsehas_afs="false"end它会提示以下错误含义,它总是返回true。(irb):5:warning:stringliteralincondition正确的语法是什么?更新:/usr/bin/fswscell寻找afs安装和运行状态。它会抛出这样的字符串,Thisworkstationbelongstocell如果afs没有运行,命令以状态1退出 最

  7. ruby - 可以正常中断的来自 Rake 的长时间运行的 shell 命令? - 2

    在几个项目中,我希望有一个类似rakeserver的rake任务,它将通过任何需要的方式开始为该应用程序提供服务。这是一个示例:task:serverdo%x{bundleexecrackup-p1234}end这行得通,但是当我准备停止它时,按Ctrl+c并没有正常关闭;它中断了Rake任务本身,它说rakeaborted!并给出堆栈跟踪。在某些情况下,我必须执行Ctrl+c两次。我可能可以用Signal.trap写一些东西来更优雅地中断它。有没有更简单的方法? 最佳答案 trap('SIGINT'){puts"Yourmessa

  8. ruby - Capistrano 中的执行、测试和捕获命令有什么区别? - 2

    关于SSHkit-Github它说:Allbackendssupporttheexecute(*args),test(*args)&capture(*args)来自SSHkit-Rubydoc,我明白execute实际上是test的别名?test之间有什么区别?,execute,capture在Capistrano/SSHKit中我应该什么时候使用? 最佳答案 执行只是执行命令。使用非0退出引发错误。测试方法的行为与execute完全相同,但是它返回bool值(true如果命令以0退出,而false否则)。它通常用于控制任务中的流程

  9. ruby - 如何在 Ruby 中执行 Windows CLI 命令? - 2

    我在目录“C:\DocumentsandSettings\test.exe”中有一个文件,但是当我用单引号编写命令时`C:\DocumentsandSettings\test.exe(我无法在此框中显示),用于在Ruby中执行命令,我无法这样做,我收到的错误是找不到文件或目录。我尝试用“//”和“\”替换“\”,但似乎没有任何效果。我也使用过系统、IO.popen和exec命令,但所有的努力都是徒劳的。exec命令还使程序退出,这是我不想发生的。提前致谢。 最佳答案 反引号环境就像双引号,所以反斜杠用于转义。此外,Ruby会将空格解

  10. ruby - 将命令行上的变量传递给 Cucumber 测试 - 2

    我正在尝试将cucumber项目的用户名和密码置于版本控制之外。有没有办法在命令行上手动将用户名和密码等变量传递给Cucumber脚本?我的备份计划是将它们放在一个YML文件中,然后将该文件添加到gitignore,这样它们就不会被置于版本控制中。 最佳答案 所以,我看到了您对铁皮人的评论,答案是肯定的。cucumberPASSWORD=my_passwordPASSWORD被设置为环境变量,您可以通过将其引用为ENV['PASSWORD']来使用它的值。例如,browser.text_field(:id=>'pwd').setEN

随机推荐