docker 常用命令

 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。

Docker有以下几个部分组成:

  1. DockerClient客户端
  2. Docker Daemon守护进程
  3. Docker Image镜像
  4. DockerContainer容器

docker镜像加速推荐阿里云:https://dev.aliyun.com/

 

docker常用命令

版本号查询 :docker --version

镜像检索:docker search mysql

镜像下载:docker pull mysql

查看本地所有的镜像:docker images

查看所有镜像: docker images

停止某个容器:docker stop+容器ID

启动某个容器:docker start+容器ID

重启某个容器 :docker restart+容器ID

删除容器:docker rm CONTAINERID

删除所有的容器:docker rm $(docker ps -a -q)

删除镜像:docker rmi IMAGE

删除所有镜像:docker rmi $(docker images -q)

运行一个容器:docker run

docker映射端口: docker -d -p 6379:6379 --name redis01 redis

查询ip等信息:docker inspect 容器ID

发布:docker push 容器ID

systemctl enable docker # 开机自动启动docker

systemctl start docker # 启动docker

systemctl restart docker # 重启dokcer

 

查看当前正在运行的容器,列出容器:docker ps

查看所有容器ID:docker ps -a -q

docker ps [OPTIONS]

OPTIONS说明:

-a :显示所有的容器,包括未运行的。

-f :根据条件过滤显示的内容。

--format :指定返回值的模板文件。

-l :显示最近创建的容器。

-n :列出最近创建的n个容器。

--no-trunc :不截断输出。

-q :静默模式,只显示容器编号。

-s :显示总的文件大小。

显示容器的标准输出:docker logs CONTAINERID

使用docker run的-i -t参数就会响应这种交互

停止正在运行的容器:docker stop CONTAINERID

查看容器或镜像的详细信息:docker inspect CONTAINERID|IMAGE

查看容器IP:docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql01

登录docker:docker login -u 账号 -p 密码

查看容器日志信息找原因:docker logs +容器ID

查看端口: netstat -tanlp

杀死某个端口: kill+端口

docker 删除none镜像

Windows版本,参考官方地址:https://forums.docker.com/t/how-to-remove-none-images-after-building/7050

docker rmi $(docker images --filter “dangling=true” -q --no-trunc)

Linux版本,参考官方地址:

docker rmi $(docker images -q)

docker rmi $(docker images | grep “^” | awk “{print $3}”)

docker rmi $(docker images -f “dangling=true” -q)

安装插件

安装rabbitmq

docker pull rabbitmq

docker pull rabbitmq:management 默认启动管理界面

启动镜像(默认用户名密码),默认guest 用户,密码也是 guest

docker run -d --hostname my-rabbit --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq:management

启动镜像(设置用户名密码)

docker run -d --hostname my-rabbit --name rabbit -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=password -p 15672:15672 -p 5672:5672 rabbitmq:management

完成后访问:http://localhost:15672/

安装nginx

拉取官方的镜像 docker pull nginx

普通启动nginx docker run --name nginx-test1 -p 8081:80 -d nginx

  • nginx-test1 容器名称
  • -d 设置容器在后台一直运行
  • -p 端口进行映射,将本地 8081 端口映射到容器内部的 80 端口(host portcontainer port

nginx 挂载部署

cd c:

新建文件夹 nginx mkdir -p ./nginx

一次在nginx 文件夹里创建目录

mkdir www

 mkdir logs

 mkdir conf

  • www: 目录将映射为 nginx 容器配置的虚拟目录
  • logs:  目录将映射为 nginx 容器的日志目录
  • conf:  目录里的配置文件将映射为 nginx 容器的配置文件

拷贝 nginx nginx.conf 文件到 conf 目录下

部署命令

docker run -d -p 8090:80 --name nginx-web-wrt -v /C/nginx/www:/usr/share/nginx/html -v /C/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /C/nginx/logs:/var/log/nginx nginx

注意 c盘盘符 需要这样写 /C/ ...

命令说明:

  • -p 8090:80 将主机的 8090 端口 映射到 容器的 80 端口
  • --name nginx-web-wrt将容器命名为 nginx-web-wrt
  • -v /C/nginx/www:/usr/share/nginx/html将我们自己创建的 www 目录挂载到容器的 /usr/share/nginx/html
  • /C/nginx/conf/nginx.conf:/etc/nginx/nginx.conf将我们自己创建的 nginx.conf 挂载到容器的 /etc/nginx/nginx.conf
  • /C/nginx/logs:/var/log/nginx将我们自己创建的 logs 挂载到容器的 /var/log/nginx

接下来访问 localhost:8090就能访问网站啦

安装redis

安装redis :docker pull redis 会安装最新的redis

查找docker Hub上的redis镜像

指定版本安装 docker pull redis 4.0

安装成功

运行镜像的命令是:docker run --name redis1 -p 6379:6379 -d redis

启动redis 并设置密码

docker run -d --name redis1 -p 6379:6379 redis --requirepass "qwertyuiop" redis-server --appendonly yes

指定配置文件发布

docker run -v /docker/redis:/data --name redis1 -d redis redis-server /data/redis.conf redis --requirepass "qwertyuiop"

命令参数解释:--name firest-redis //给新建的容器命名;-p //映射端口,这样外部访问6379就能访问到容器内的6379端口了;-d redis //这个就是要指定镜像名称

运行结果,并用docker ps查看容器列表

数据持久化

拉取redis镜像

dataconf两个文件夹,位置随意。

eg:

mkdir -p /root/docker/redis/data

mkdir -p /root/docker/redis/conf

增加配置文件 redis.conf

配置文件:从网上下载一个linux的redis.conf 【http://download.redis.io/releases/下载对应版本的redis

指定下面命令启动:

docker run --name my_redis -p 6379:6379 -v /root/docker/redis/data:/data -v /root/docker/redis/conf/redis.conf:/etc/redis/redis.conf -d redis redis-server /etc/redis/redis.conf

也可以在后面添加以下参数:

自动启动 --appendonly yes

密码 --requirepass "qwertyuiop"

远程访问配置

修改启动默认配置(从上至下依次):

bind 127.0.0.1 #注释掉这部分,这是限制redis只能本地访问

protected-mode no #默认yes,开启保护模式,限制为本地访问

daemonize no#默认no,改为yes意为以守护进程方式启动,可后台运行,除非kill进程,改为yes会使配置文件方式启动redis失败

databases 16 #数据库个数(可选),我修改了这个只是查看是否生效。。

dir  ./ #输入本地redis数据库存放文件夹(可选)

appendonly yes #redis持久化(可选)

requirepass 123456 //密码

释义如下:

  • –name:给容器起一个名
  • -p端口映射 宿主机:容器
  • -v挂载自定义配置 自定义配置:容器配置
  • -d:表示后台启动redis
  • redis-server --appendonly yes 容器redis-server启动命令并打开redis持久化配置

为什么需要挂载目录:个人认为docker是个沙箱隔离级别的容器,这个是它的特点及安全机制,不能随便访问外部(主机)资源目录,所以需要这个挂载目录机制。

redis-server /etc/redis/redis.conf  以配置文件启动redis,加载容器内的conf文件,最终找到的是挂载的目录/root/docker/redis/conf/redis.conf/redis.conf

docker 安装mongodb:docker pull mongo

docker pull mongo:4.0.0 只能版本下载更快不知道为什么

端口映射:docker run -d -p 27017:27017 --name mongo1 mongo

查看日志:docker logs mymongo

重启容器: docker restart mymongo

暂停容器: docker stop mymongo

删除容器: docker rm mymongo

关闭容器:docker kill mymongo

#获取容器PID

docker inspect --format "{{.State.Pid}}" myngix

#docker查看容器IP

docker inspect --format='{{.NetworkSettings.IPAddress}}' $(docker ps -a -q)

#查看变量

docker exec -it mynginx env

运行容器

在镜像文档里,我们知道了该镜像映射的端口号是27017,配置文件的位置在/data/configdb,数据库文件的位置在/data/db

docker run -d -p 27017:27017 -v mongo_configdb:/data/configdb -v mongo_db:/data/db --name mongo docker.io/mongo

我们输入如下命令来启动容器。

容器挂载

docker run --name mongodb -p 27017:27017 -v /docker/mongo:/data/db  -d -d mongo

docker run -d -p 27017:27017 --name mongo01 -v /docker/mongo/config:/data/configdb -v /docker/mongo/db:/data/db mongo

进入容器.

docker exec -it mongodb bash

mongo

 创建用户

# 进入 admin 的数据库

use admin

# 创建管理员用户

db.createUser(

{

user: "admin",

pwd: "123456",

roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]

}

)

# 创建有可读写权限的用户. 对于一个特定的数据库, 比如'demo'

db.createUser({

user: 'test',

pwd: '123456',

roles: [{role: "read", db: "demo"}]

})

top和kill的主要区别:stop给与一定的关闭时间交由容器自己保存状态,kill直接关闭容器

docker 安装mysql

docker 安装mysql:docker pull mysql/mysql-server

端口映射:docker run -d -p 3306:3306 --name mysql01 mysql/mysql-server

docker run -d -p 3306:3306 -e MYSQL_USER="test" -e MYSQL_PASSWORD="1234." -e MYSQL_ROOT_PASSWORD="1234." --name mysql mysql/mysql-server --character-set-server=utf8 --collation-server=utf8_general_ci --lower_case_table_names=1

查询安装默认密码 :docker logs mysql :本次安装默认密码为: AJG@GAlPYDEJ0hAkomaDCoGEBtac

lower_case_table_names=1 是用来忽略表名称大小写 不需要可以不加

docker 容器 修改mysql密码

1.进入 mysql 容器

docker exec -it mysql /bin/bash

添加vim

yum install vim

登陆mysql:mysql -uroot -p

mysql -uroot -p1234.

set password for 'root'@'localhost' = password('1234.');

8.0以上语句为: alter user user() identified by "1234.";

grant all privileges on *.* to 'test'@'127.0.0.1' identified by '1234.' with grant option;

创建新用户
mysql> CREATE USER 'root'@'localhost' IDENTIFIED BY '1234.';
给 mysql 用户最大的权限 
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
mysql> CREATE USER 'test'@'%' IDENTIFIED BY '1234.';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'test'@'%' WITH GRANT OPTION;



进行授权远程连接(注意mysql 8.0跟之前的授权方式不同)

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';

RENAME USER 'root'@'localhost' TO 'root'@'%';

RENAME USER 'test'@'localhost' TO 'test'@'%';

刷新权限

flush privileges;

此时,还不能远程访问,因为Navicat只支持旧版本的加密,需要更改mysql的加密规则

更改加密规则

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '1234.';

更新test用户密码

ALTER USER 'test'@'%' IDENTIFIED WITH mysql_native_password BY '1234.';

flush privileges;

再次刷新权限测试是否可以登陆

启动mysql的时候遇到一个问题: driver failed programming external connectivity on endpoint mysql01

或者错误: Error response from daemon: failed to create endpoint mysql on network nat: hnsCall failed in Win32: The process cannot access the file because it is being used by another process. (0x20).

查询结果是3306被占用

解决办法

cmd 命令-netstat -ano

找到占用3306的

查看被占用端口对应的PID,输入命令:netstat -aon|findstr " 2200",回车,记下最后一位数字,即PID,这里是16412

PS C:WINDOWSsystem32> netstat -aon|findstr "16412"

  TCP    0.0.0.0:3306           0.0.0.0:0              LISTENING       16412

  TCP    [::]:3306              [::]:0                 LISTENING       16412

PS C:WINDOWSsystem32> a

继续输入tasklist|findstr "16412",回车,查看是哪个进程或者程序占用了2720端口,结果是:docker.ackend.exe

com.docker.backend.exe       16412 Services                   0     16,364 K

PS C:WINDOWSsystem32>

最后使用命令结束该进程: taskkill /pid 3306/f

然后重启docker 启动docker start mysql01 启动成功

docker容器参数启动Mysql (用容器参数添加新用户和修改root账户密码,修改字符集)

docker run -d -p 3306:3306 -e MYSQL_USER="test" -e MYSQL_PASSWORD="1234." -e MYSQL_ROOT_PASSWORD="1234." --name mysql01 mysql/mysql-server  --character-set-server=utf8 --collation-server=utf8_general_ci

错误: SQLException: access denied for  @'localhost' (using password: no)

解决办法  GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

                 flush privileges;

mysql 5.7 安装

docker pull mysql:5.7

运行

docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=1234. -d mysql:5.7 --lower_case_table_names=1

进入mysql cmd

mysql -uroot -p1234.

添加远程链接,修改加密规则

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '1234.';

flush privileges;

安装 SQL SERVER

docker pull mcr.microsoft.com/mssql/server:2017-latest

docker pull mcr.microsoft.com/mssql/server:2019-CTP3.2

运行

docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=123456qQ." `

   -p 1433:1433 --name sql1` -d mcr.microsoft.com/mssql/server:2017-latest

发布

docker 发布netcore

#docker build -t testapi .

#docker run --name testapi -p 8080:80 -d testapi

#使用network 发布 :docker run --name testapi -p 8080:80 --net my_net  -d testapi

docker run --name userapi -p 8080:80 --net my_net  -d userapi/aspnetcore:prod

docker build -t mb-rest:dev .

docker build -t mb-rest:dev .

docker run --name mb-rest -p 8001:80 -d mb-rest:dev

 

Windos 使用Docker创建网络

错误

Error response from daemon: could not find plugin bridge in v1 plugin registry: plugin not found

1

容器选择:windos containers

原因

通过docker network ls 我们可以看到,当前容器下driver支持为nat,null,isc。

NETWORK ID     NAME            DRIVER          SCOPE

105f3991f8fd nat          nat             local

df3b13b6bdc3        none            null            local

093ced5de50e        默认交换机        ics             local  

 Linux

 NETWORK ID          NAME                DRIVER              SCOPE

 5080dcfb0d74        bridge              bridge              local

 47b20eae6d51        host                host                local

 e1a337c9c6dc        none                null                local

查看容器IP:docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql01

解决方案

docker network create -d ics my_net

docker network create -d nat my_net

docker network create -d my_net02

链接mysql:docker network connect my_network mysql01

docker network connect mynet redis1

移除:docker network disconnect 61e03ef9d7422822a2998dbc7697458e3ffede5c9ab74fba22ceb470eaac6d9c redis1

安装gitlab:docker pull gitlab/gitlab-ce:latest

使用以前指定的选项再次创建容器:

docker run --detach --hostname gitlab.example.com --publish 443:443 --publish 80:80 --publish 22:22 --name gitlab --restart always --volume /srv/gitlab/config:/etc/gitlab --volume /srv/gitlab/logs:/var/log/gitlab --volume /srv/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce:latest

错误

Docker 安装报错:没有找到installationmanifest.json文件

在 win10 中安装或者升级 docker desktop 时报出错误:

Installation failed: Could not find file C:Program FilesDockerDockerinstallationmanifest.json.

解决办法:

  1. 关闭安装进程
  2. 进入注册表编辑器:WIN+R,输入 regedit,回车
  3. 找到 ComputerHKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallDocker for Windows 并删除
  4. 重新运行安装程序
安装redis 错误:no matching manifest for windows/amd64 10.0.17763 in the manifest list entries

在 Windows 10中.通过以实验模式运行docker守护进程绕过

  1. Right click Docker instance
  2. Go to Settings
  3. Daemon
  4. Advanced
  5. Set the "experimental": true
  6. Restart Docker
Docker:发布镜像问题denied: requested access to the resource is denied解决方法

先列出所有镜像:docker images

将要发布的镜像改到自己账户名下。我的账户名:383268343

docker tag mb-rest:dev 383268343/mb-rest:dev

再次发布镜像

docker push 383268343/mb-rest:dev

docker rum tcp错误:

docker自动启动容器

使用重启策略

要为容器配置重新启动策略,请--restart在使用该docker run命令时使用该标志。--restart标志的值可以是以下任何一种:

描述

no

不要自动重启容器。(默认)

on-failure

如果容器由于错误而退出,则重新启动容器,该错误表现为非零退出代码。

always

如果容器停止,请务必重启容器。如果手动停止,则仅在Docker守护程序重新启动或手动重新启动容器本身时才重新启动。(参见重启政策详情中列出的第二个项目)

unless-stopped

类似于always,除了当容器停止(手动或其他方式)时,即使在Docker守护程序重新启动后也不会重新启动容器。

以下示例启动Redis容器并将其配置为始终重新启动,除非明确停止或重新启动Docker。

$ docker run -dit --restart unless-stopped redis

重启政策详情

使用重启策略时请记住以下几点:

  • 重启策略仅在容器成功启动后生效。在这种情况下,成功启动意味着容器启动至少10秒并且Docker已开始监视它。这可以防止根本不启动的容器进入重启循环。
  • 如果手动停止容器,则会忽略其重新启动策略,直到Docker守护程序重新启动或手动重新启动容器。这是防止重启循环的另一种尝试。
  • 重新启动策略仅适用于容器。群组服务的重新启动策略配置不同。请参阅与服务重新启动相关的 标志。

如果run时没有添加restart 可以通过update命令追加

docker update --restart=always web

1、先后台启动容器未加restart参数 

2、docker ps 查看了当前运行的容器 

3、重启docker 服务 

4、再次docker ps 查看当前运行的容器,发现容器并没有运行 

5、利用 update 设置 restart=always 

6、重启docker 服务 

7、再次docker ps 查看当前运行的容器,此时发现已经自动启动容器 

 
原文地址:https://www.cnblogs.com/liaokui/p/11277467.html