一、容器:
安装缺少vim命令处理
apt-get update && apt-get install vim
有镜像才能创建容器,这是根本前提(下载一个centos或者ubuntu镜像)docker pull centos/ubuntu
docker run -it --name=ubuntu1 ubuntu /bin/bash
docker ps 列出所有的容器
-a 列出当前所有正在运行的容器+历史上运行过的
-l 显示最近创建的容器
-n 显示最近n个创建的容器
-q 静默模式,只显示容器编号
退出容器:
1、exit run进去容器,exit退出,容器停止
2、 ctrl+p+q run进去容器,ctrl+p+q 退出,容器不停止
docker start 容器id/名 启动容器
docker restart 容器id/名 重启
docker stop 容器id/名 停止
docker kill 容器id/名 强制停止容器
docker rm 容器id 删除已停止的容器
一次性删除多个容器实例:
1、docker rm -f $(docker ps -a -q)
2、docker ps -a -q | xargs docker rm
查看容器日志: docker logs 容器id
重新进入容器:
docker exec -it 容器id /bin/bash
docker attach 容器id 重新进入
两者区别:attach直接进入容器启动命令的终端,不会启动新的进程;用exit退出,会导致容器的停止;
exec是在容器中打开新的终端,并且可以启动新的进程,用exit退出,不会导致容器停止;
复制:
docker cp 容器id:容器内路径 目的主机路径
导入/导出:
docker export 容器id > 文件名.tar
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2ad29ae9a8ba ubuntu "/bin/bash" 12 seconds ago Up 11 seconds loving_payne
[root@localhost /]# docker export 2ad29ae9a8ba > u.tar
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本
[root@localhost /]# cat u.tar | docker import hzq/ubuntu:1.0.0
open hzq/ubuntu:1.0.0: no such file or directory
[root@localhost /]# cat u.tar | docker import - hzq/ubuntu:1.0.0
sha256:3ba7bf6dc545d521074680b14595f1bc9d0a05f42757abd4f629ffa7c83a8c25
[root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hzq/ubuntu 1.0.0 3ba7bf6dc545 16 seconds ago 0B
提交容器副本使之成为一个新的镜像:
docker commit -m=“提交的描述信息” -a=“作者” 容器id 要创建的目标镜像名:【标签名】
eg: docker commit -m=“新增vim命令功能” -a=“hza” 2ad29ae9a8ba ubuntu:1.2.0
镜像推送到阿里云:
1. 登录阿里云Docker Registry
$ docker login --username=15878******@sina.cn registry.cn-hangzhou.aliyuncs.com
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
您可以在访问凭证页面修改凭证密码。
2. 从Registry中拉取镜像
$ docker pull registry.cn-hangzhou.aliyuncs.com/hzq17636/test-ubuntu:[镜像版本号]
3. 将镜像推送到Registry
$ docker login --username=15878******@sina.cn registry.cn-hangzhou.aliyuncs.com
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/hzq17636/test-ubuntu:[镜像版本号]
$ docker push registry.cn-hangzhou.aliyuncs.com/hzq17636/test-ubuntu:[镜像版本号]
请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。
4. 选择合适的镜像仓库地址
从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。
如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-hangzhou.aliyuncs.com 作为Registry的域名登录。
5. 示例
使用"docker tag"命令重命名镜像,并将它通过专有网络地址推送至Registry。
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
registry.aliyuncs.com/acs/agent 0.7-dfb6816 37bb9c63c8b2 7 days ago 37.89 MB
$ docker tag 37bb9c63c8b2 registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
使用 "docker push" 命令将该镜像推送至远程。
$ docker push registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
apt-get update
apt-get install net-tools --ifconfig
本地镜像发布到私有仓库:
1、docker pull registry 拉取registry镜像
2、 运行registry私有仓库
docker run -d -p 5000:5000 -v /hzq/myregistry/:/tmp/registry --privileged=true registry
3、 curl验证仓库
curl -XGET http://192.168.101.65:5000/v2/_catalog
[root@localhost /]# curl -XGET http://192.168.101.65:5000/v2/_catalog
{"repositories":[]} 验证通过
4、将新镜像修改符合私服规范的tag
公式:docker tag 镜像:tag Host:port/Registry:tag
eg:docker tag myubuntu:1.0.0 192.168.101.65:5000/myubuntu:1.0.0
5、修改配置文件使之支持http
[root@localhost /]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://8iyr0vnh.mirror.aliyuncs.com"]
}
[root@localhost /]# vim /etc/docker/daemon.json
[root@localhost /]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://8iyr0vnh.mirror.aliyuncs.com"],
"insecure-registries":["192.168.101.65:5000"]
}
[root@localhost /]# systemctl restart docker --重启
[root@localhost /]#
6、push推送到私有仓库
[root@localhost /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.101.65:5000/myubuntu 1.0.0 37938b7ccef0 6 minutes ago 120MB
myubuntu 1.0.0 37938b7ccef0 6 minutes ago 120MB
centos latest 5d0da3dc9764 2 years ago 231MB
[root@localhost /]# docker push 192.168.101.65:5000/myubuntu:1.0.0
7、curl验证私服库上是否有新推送的镜像
[root@localhost /]# curl -XGET http://192.168.101.65:5000/v2/_catalog
{"repositories":["myubuntu"]}
8、pull到本地并运行
docker pull 192.168.101.65:5000/myubuntu:1.0.0
容器数据卷:
docker挂载主机目录访问如果出现cannot open directory.:Permission denied
解决:在挂载目录后多加一个 --privileged=true
1、宿主VS容器之间映射添加容器卷
公式:docker run -it -v /宿主机目录:/容器内目录 ubuntu /bin/bash
eg:docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data --name=myu3 ubuntu /bin/bash
root@91430fc9ca16:/# cd /tmp/docker_data/
root@91430fc9ca16:/tmp/docker_data# ll
total 0
root@91430fc9ca16:/tmp/docker_data# touch dockerin.txt
root@91430fc9ca16:/tmp/docker_data# ll
-rw-r--r--. 1 root root 0 Sep 30 19:21 dockerin.txt
root@91430fc9ca16:/tmp/docker_data# ll
-rw-r--r--. 1 root root 0 Sep 30 19:21 a.txt
-rw-r--r--. 1 root root 0 Sep 30 19:21 dockerin.txt
查看是否挂载成功:
docker inspect 容器id
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
91430fc9ca16 ubuntu "/bin/bash" 7 minutes ago Up 7 minutes myu3
cb6828ea243d registry "/entrypoint.sh /etc…" About an hour ago Up About an hour 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp epic_kepler
[root@localhost ~]# docker inspect 91430fc9ca16
"Mounts": [
{
"Type": "bind",
"Source": "/tmp/host_data",
"Destination": "/tmp/docker_data",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
1.3 容器和宿主机之间的数据共享
docker修改,主机同步获得;
主机修改,docker同步获得;
docker容器stop,主机修改,docker容器重启数据也同步过来;
2、读写规则映射添加说明 rw ro
默认rw
docker run -it -v /宿主机目录:/容器内目录:rw ubuntu /bin/bash
ro 容器实例内部被限制,只能读取不能写
docker run -it -v /宿主机目录:/容器内目录:rw ubuntu /bin/bash
3、卷的继承和共享
容器1完成了和宿主机的映射,容器2继承容器1的卷规则:-volumes-from 父类
docker run -it --privileged=true --volumes-from 父类 --name=myu3 ubuntu /bin/bash
[root@localhost host_data]# docker run -it --privileged=true --volumes-from myu3 --name=u4 ubuntu /bin/bash
root@973ad59da23f:/# cd /tmp/docker_data/
root@973ad59da23f:/tmp/docker_data# ll
-rw-r--r--. 1 root root 0 Sep 30 19:21 a.txt
-rw-r--r--. 1 root root 0 Sep 30 19:21 dockerin.txt
root@973ad59da23f:/tmp/docker_data# touch u4.txt
root@973ad59da23f:/tmp/docker_data# ll
-rw-r--r--. 1 root root 0 Sep 30 19:21 a.txt
-rw-r--r--. 1 root root 0 Sep 30 19:21 dockerin.txt
-rw-r--r--. 1 root root 0 Sep 30 19:46 u4.txt
u4继承了myu3的卷规则,不管u4/myu3新建文件都会同步到host,之间也会相互同步
docker常规软件安装步骤:
1. 搜索镜像
2. 拉取镜像
3. 查看镜像
4. 启动镜像 -服务端口映射
5. 停止容器
6. 移除容器
安装tomcat:
1. docker hub上查找tomcat镜像
docker search tomcat
2. 从docker hub上拉取tomcat镜像到本地
docker pull tomcat
3. docker images查看是否成功拉取到tomcat
docker images tomcat
4. 运行tomcat镜像
docker run -it -p 8080:8080 tomcat
5. 访问tomcat首页
(tomcat10 有webapps和webapps.dist目录,需要删了webapps,然后把webapps.dist改为webapps)
6. 免修改版说明 安装tomcat8-jdk8版本
docker run -d -p 8080:8080 --name t2 billygoo/tomcat8-jdk8
安装mysql:
-
docker search mysql:5.7
-
docker pull mysql:5.7
-
docker images mysql
-
启动mysql
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
docker安装数据库mysql会出现的问题: -
没有用到卷,容器删除后,数据问题?
docker run -d -p 3306:3306 --privileged=true -v /hzq/mysql/log:/var/log/mysql -v /hzq/mysql/data:/var/lib/mysql -v /hzq/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root --name mysql mysql:5.7--privileged=true 表示开启容器数据卷的权限;这次创建 MySQL 中,增加了 3 个容器数据卷。 -v /xsh/mysql/log/:/var/log/mysql 表示同步 MySQL 的日志到宿主机; -v /xsh/mysql/data/:/var/lib/mysql 表示同步 MySQL 的数据到宿主机; -v /xsh/mysql/conf/:/etc/mysql/conf.d 表示同步 MySQL 的配置到宿主机。 -e MYSQL_ROOT_PASSWORD 设置的是 MySQL 的 root 用户的登录密码
2.中文乱码?
我们通过创建 my.cnf 里面配置 MySQL 的默认字符集为 UTF-8,然后通过容器数据卷同步给 MySQL 容器实例。 在宿主机上进入 MySQL 容器数据卷的配置目录 /xsh/mysql/conf 。 $ cd /xsh/mysql/conf 发现里面为空。在这个目录下创建 my.cnf 配置文件。 $ vim my.cnf 然后把下面这段内容粘贴进去。 [client] default_character_set=utf8 [mysqld] collation_server = utf8_general_ci character_set_server = utf8 然后重启mysql docker restart mysql
**
docker安装redis:6.0.8
**
1、从docker hub上(阿里云加速器)拉取redis:6.0.8镜像到本地
docker pull redis:6.0.8
2、在centos宿主机下新建目录/hzq/redis
mkdir -p /hzq/redis
3、将一个redis.conf文件模版拷贝到/hzq/redis/目录下,并修改/hzq/redis下面的redis.conf文件
初始文件:
3.1 开启redis密码验证: requirepass 123
3.2 允许redis外部连接 注释掉 #bind 127.0.0.1
3.3 将daemonize yes 注释起来或则 设置成daemonize no,因为该配置和docker run中的-d参数冲突,会导致容器一直启动失败。
3.4 开启redis数据持久化appendonly yes
3.5 protected-mode 本机访问保护模式,设置no
在Redis6.0中,多线程机制默认是关闭的,如果需要使用多线程功能,需要在redis.conf中完成两个设置
设置io-thread-do-reads配置项为yes,表示启动多线程
设置io-threads线程个数。关于线程数的设置,官方的建议是如果为 4 核的 CPU,建议线程数设置为 2 或 3,如果为 8 核 CPU 建议线程数设置为 6,线程数一定要小于机器核数,线程数并不是越大越好
4、使用redis:6.0.8镜像创建容器(也叫运行镜像)
docker run -p 6379:6379 --name redis3 --privileged=true -v /hzq/redis/redis.conf:/etc/redis/redis.conf -v /hzq/redis/data:/data -v /etc/localtime:/etc/localtime -d redis:6.0.8 redis-server /etc/redis/redis.conf
5、进入容器并测试redis-cli
docker exec -it redis3 /bin/bash
redis-cli
6、验证redis配置文件使用的是修改外部数据卷中的redis.conf文件
把databases 15改为10 重启进入后select 15报错
**
安装Nginx:
**
**1.先在docker中运行nginx(为了知道相关的配置)**
# 拉取nginx镜像
docker pull nginx
#启动(暂时)
docker run -d --name nginx -p 80:80 nginx
#查看镜像
docker ps
#进入容器内部
docker exec -it nginx /bin/bash
#找到nginx.conf所在的地址(找到相关配置文件)
find / -name 'nginx.conf'
# 这里以/etc/nginx/nginx.conf为例
#推出容器
exit;
**2.将容器的配置文件 复制到 创建好的文件夹中**
#创建外部文件夹
mkdir -p /hzq/nginx/conf
mkdir -p /hzq/nginx/logs
mkdir -p /hzq/nginx/html
将容器的配置文件 复制到 创建好的文件夹中
docker cp nginx:/etc/nginx/nginx.conf /hzq/nginx/conf/
docker cp nginx:/etc/nginx/conf.d/ /hzq/nginx/conf/
docker cp nginx:/usr/share/nginx/html/ /hzq/nginx/
docker cp nginx:/var/log/nginx /hzq/nginx/logs
**3.启动nginx**
docker run -d --name nginx -p 80:80 -v /hzq/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /hzq/nginx/conf/conf.d:/etc/nginx/conf.d/ -v /hzq/nginx/logs:/var/log/nginx -v /hzq/nginx/html:/usr/share/nginx/html -e TZ=Asia/Shanghai --privileged=true nginx
**4.验证配置文件**
# 语法
docker exec [容器ID|容器名] nginx -t
docker exec [容器ID|容器名] nginx -s reload
#检验配置文件正确性
docker exec nginx nginx -t
#重新加载配置文件
docker exec nginx nginx -s reload