Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker有以下几个部分组成:
- DockerClient客户端
- Docker Daemon守护进程
- Docker Image镜像
- 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+端口
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)
安装插件
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/
拉取官方的镜像 docker pull nginx
普通启动nginx docker run --name nginx-test1 -p 8081:80 -d nginx
- nginx-test1: 容器名称
- -d: 设置容器在后台一直运行
- -p: 端口进行映射,将本地 8081 端口映射到容器内部的 80 端口(host port:container 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 :docker pull redis 会安装最新的redis
查找docker Hub上的redis镜像
指定版本安装 docker pull redis 4.0
安装成功
启动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镜像
新建data和conf两个文件夹,位置随意。
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 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 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;
再次刷新权限测试是否可以登陆
或者错误: 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 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
解决办法 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
flush privileges;
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;
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 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
错误
在 win10 中安装或者升级 docker desktop 时报出错误:
Installation failed: Could not find file C:Program FilesDockerDockerinstallationmanifest.json.
解决办法:
- 关闭安装进程
- 进入注册表编辑器:WIN+R,输入 regedit,回车
- 找到 ComputerHKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallDocker for Windows 并删除
- 重新运行安装程序
在 Windows 10中.通过以实验模式运行docker守护进程绕过
- Right click Docker instance
- Go to Settings
- Daemon
- Advanced
- Set the "experimental": true
- Restart Docker
先列出所有镜像: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 查看当前运行的容器,此时发现已经自动启动容器