1. 安装docker
- 可以直接
yum install docker
安装。 - 建议:参考docker官网
- 阿里云上的安装步骤:
// 更新yum包,生产环境需谨慎,学习随便玩
yum -y update
// 卸载旧版本,如果以前装过
yum remove docker docker-common docker-selinux docker-engine
// 安装需要的软件包, yum-util 提供yum-config-manager功能,另两个是devicemapper驱动依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
// 设置一个yum源,一个中央仓库,一个阿里镜像
yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo(中央仓库)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo(阿里仓库)
// 查询docker有那些可用版本
yum list docker-ce --showduplicates | sort -r
// 选择一个版本安装
yum -y install docekr-ce:20.10.9-3.el8
2. 修改阿里云镜像
- 有一个daemon.json文件,配置镜像文件
cd /etc/docker
- 打开daemon.json文件
vim daemon.json
- 打开阿里云,找到自己的镜像
- 加载镜像文件,重启docker
sudo systemctl daemon-reload
sudo systemctl restart docker
3. docker基本操作
- hello-wolrd
docker run hello-world
- 查看已经拉取的镜像
docker images
- 查看仓库中的某个镜像,也可以到dockerHub中查看
docker search redis
- 拉取镜像,不指定版本就默认拉取最新版
docker pull redis
// 指定版本
docker pull redis:5.0.4
- 查看正在运行的容器信息
docker ps
- 查看所有容器信息,包括停止的
docker ps -a
- 查询容器的信息,如网关,ip等
docker inspect 容器id/名称
4. docker的帮助信息
docker --help
Options:
--config string Location of client config files (default "/root/.docker")
-D, --debug Enable debug mode
--help Print usage
-H, --host list Daemon socket(s) to connect to (default [])
-l, --log-level string Set the logging level ("debug", "info", "warn", "error", "fatal") (default "info")
--tls Use TLS; implied by --tlsverify
--tlscacert string Trust certs signed only by this CA (default "/root/.docker/ca.pem")
--tlscert string Path to TLS certificate file (default "/root/.docker/cert.pem")
--tlskey string Path to TLS key file (default "/root/.docker/key.pem")
--tlsverify Use TLS and verify the remote
-v, --version Print version information and quit
Management Commands:
container Manage containers
image Manage images
network Manage networks
node Manage Swarm nodes
plugin Manage plugins
secret Manage Docker secrets
service Manage services
stack Manage Docker stacks
swarm Manage Swarm
system Manage Docker
volume Manage volumes
Commands:
attach Attach to a running container
build Build an image from a Dockerfile
commit Create a new image from a container's changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes on a container's filesystem
events Get real time events from the server
exec Run a command in a running container
export Export a container's filesystem as a tar archive
history Show the history of an image
images List images
import Import the contents from a tarball to create a filesystem image
info Display system-wide information
inspect Return low-level information on Docker objects
kill Kill one or more running containers
load Load an image from a tar archive or STDIN
login Log in to a Docker registry
logout Log out from a Docker registry
logs Fetch the logs of a container
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
ps List containers
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
rmi Remove one or more images
run Run a command in a new container
save Save one or more images to a tar archive (streamed to STDOUT by default)
search Search the Docker Hub for images
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
version Show the Docker version information
wait Block until one or more containers stop, then print their exit codes
Run 'docker COMMAND --help' for more information on a command.
翻译如下
选项:
客户端配置文件的位置(默认为"/root/.docker")
-D,——debug开启调试模式
——帮助 打印使用
-H,——host list要连接的守护套接字(默认为[])
-l,——log-level string设置日志级别("debug", "info", "warn", "error", "fatal")(默认为"info")
——tls 使用TLS;暗示了——tlsverify
——tlscacert string仅由该CA签名的信任证书(default "/root/.docker/ CA .pem")
——tlscert string TLS证书文件路径(默认为“/root/.docker/cert.pem”)
——tlskey string TLS密钥文件路径(默认为“/root/.docker/key.pem”)
——tlsverify使用TLS,验证远程
-v,——version打印版本信息后退出
管理命令:
容器管理的容器
图像处理图像
网络管理网络
管理集群节点
插件管理插件
管理Docker的秘密
服务管理服务
管理Docker栈
群管理群
系统管理码头工人
卷管理卷
命令:
attach连接到正在运行的容器
从Dockerfile构建一个映像
根据容器的更改创建一个新的映像
cp在容器和本地文件系统之间复制文件/文件夹
create创建一个新的容器
diff检查容器文件系统的变化
events从服务器获取实时事件
exec在正在运行的容器中运行命令
export将容器的文件系统导出为tar存档
history显示图像的历史记录
图像列表图片
从tarball中导入内容以创建文件系统映像
info显示系统信息
返回Docker对象的低级信息
kill杀死一个或多个正在运行的容器
从tar归档文件或STDIN中加载一个映像
login登录到Docker注册表
logout从Docker注册表注销
logs获取容器的日志
pause暂停一个或多个容器中的所有进程
port列出端口映射或容器的特定映射
ps 列表容器
pull从注册表中提取图像或存储库
push将图像或存储库推送到注册表
重命名一个容器
restart重启一个或多个容器
rm移除一个或多个容器
rmi删除一个或多个图像
run在新的容器中运行命令
将一个或多个映像保存到tar存档(默认情况下流到STDOUT)
搜索Docker Hub图片
start启动一个或多个已停止的容器
stats实时显示容器资源使用的统计信息
stop停止一个或多个正在运行的容器
创建一个指向SOURCE_IMAGE的标记TARGET_IMAGE
top显示容器当前运行的进程
unpause取消暂停一个或多个容器中的所有进程
update更新一个或多个容器的配置
version显示Docker版本信息
wait阻塞,直到一个或多个容器停止,然后打印它们的退出码
运行'docker COMMAND——help'获取命令的更多信息。
5. docker容器的数据卷
- 三个问题?
- Docker容器删除之后,容器里的数据也会随之删除吗?(是)
- Docker容器可以和外部机器直接交换文件吗?(不能)
- Docker容器之间可以交换数据吗?(不行)
- 数据卷是Dokcer宿主机中的一个目录或文件。
- 当容器目录和数据卷目录绑定以后,对方的修改会立即同步。
- 一个数据卷可以被多个容器同时挂载。
- 一个容器可以挂载多个数据卷。
- 容器启动时配置数据卷:
docker run ... -v 宿主机目录或文件:容器目录或文件
- 目录必须是绝对路径,目录不存在会自动创建。
5. dokcer安装redis
- 拉取redis镜像
docker pull redis
- 下载一个redis配置文件,http://download.redis.io/redis-stable/redis.conf
- 注意这里的配置文件下载的是最新版,redis也要pull最新版,不然配置文件不对应,会报错
注释掉只允许本机访问
# bind 127.0.0.1 -::1
注释掉守护线程启动,在docker中-d就是守护线程启动,会冲突报错
# daemonize no
开启持久化
appendonly yes
关闭,外部网络就可以连接
protected-mode no
- 创建一个存放redis.conf和数据备份data的地点
cd /usr/local
mkdir redis
cd redis
// 将下载的redis.conf移过来
mv redis.conf /usr/local/redis
mkdir data
- 启动一个redis容器
docker run -p 6379:6379 --name myredis1 -v /usr/local/redis/redis.conf:/etc/redis/redis.conf -v /usr/local/redis/data:/data --privileged=true -d redis redis-server /etc/redis/redis.conf --appendonly yes --requirepass "1998927ren@"
docker run -p 6380:6380 --name redis01 -v /root/redis/redis.conf:/etc/redis/redis.conf -v /root/redis/data:/data --privileged=true -d redis redis-server /etc/redis/redis.conf --appendonly yes --requirepass "1998927ren@"
-p 映射端口号
--name 容器名称
-v /usr/local/redis/redis.conf:/etc/redis/redis.conf 映射redis.conf配置文件
-v /usr/local/redis/data:/data 映射redis的持久化文件
-d redis镜像
--appendonly redis启动后数据持久化
--privileged=true 赋予容器权限,不然持久化的时候就会报错
- 移除一个容器
docker rm 容器名或id
- 查看redis的日志
docker logs 容器名或id
// -f实时查看
docker logs -f 容器名或id
// 查看日志最后二十行
docker logs --tail=20 容器名或id
- 进入运行的容器
docker exec -ti 容器名或id bash
- 连接redis的客户端
dcoker exec -ti 容器名或id redis-cli
查看exec的参数
docker exec --help
Options:
-d, --detach Detached mode: run command in the background
--detach-keys string Override the key sequence for detaching a container
-e, --env list Set environment variables (default [])
--help Print usage
-i, --interactive Keep STDIN open even if not attached
--privileged Give extended privileges to the command
-t, --tty Allocate a pseudo-TTY
-u, --user string Username or UID (format: <name|uid>[:<group|gid>])
- 使用java连接linux上的redis之前,先使用
telnet id port
进行测试连接。
6. docker安装配置nginx
- 查看ngnix仓库资源
docker search ngnix
- 拉取nginx镜像
docker pull nginx
- 创建一个nginx容器
docker run --name mynginx -p 9001:9001 -m 1024M -d nginx
-m 指定该容器分配的最大内存
-d 后台运行
- 进入容器中
docker exec -ti mynginx bash
- 查看容器文件和文件夹
ls
- 进入配置文件
cd etc/nginx
-
执行
vim nginx.conf
,配置nginx的配置文件。 -
报错:没有找到该命令vim
-
执行,更新数据源,获取最新软件包(在容器中执行不退出)
apt-get update
- 下载vim软件(在容器中执行不退出)
apt-get install vim
- 打开nginx配置文件
vim nginx.conf
- 将容器中的文件拷贝出来
docker cp mynginx:/etc/nginx/nginx.conf /usr/local
- 将修改后的配置文件替换容器中的配置文件
docker cp nginx.conf mynginx:/etc/nginx/nginx.conf
7. docker中nginx连接超时问题
- 这里的nginx在虚拟机上,无法将请求转发到主机上,要想解决,可以关闭防火墙。
- 如果不想关闭防火墙。先尝试虚拟机能不能ping通主机,如果不能,按以下设置
- 控制面板
-
这样设置虚拟机就可以ping通主机了。
-
下面开放主机的端口号。可以先测试
telnet ip port
查看能不能访问端口号。(但是我这样设置了还是不能访问)
- 开放了半天,端口号还是无法访问,还是直接关防火墙吧。
8. docker安装mongdb
- 在docker中mongdb叫mongo
- 查看仓库中的mongo
docker search mongo
- 拉取mongo镜像
docker pull mongo
- 创建mongo容器
docker run --name mongdb -p 27017:27017 --privileged=true -v /usr/local/mongdb/data/db:/data/db -d mongo
-v /usr/local/mongdb/data/db:/data/db 挂在data数据点
--privileged=true 必须加上才能挂在数据点,赋予容器权限
- 为mongdb创建一个管理员用户,进入mongdb容器
docker exec -ti 容器名称或id bash
9. mongdb基本操作
一、基操
- 进入容器
docker exec -ti 容器名称或id bash
- 进入mongo客户端
mongo
- 显示所有数据库
show dbs
- 查看命令提示
db.help()
二、数据库
- 数据库不存在就创建,存在就切换
use mydb(数据库名称)
- 查询所有数据库
show dbs
- 查询当前使用的数据库
db.getName()
- 删除当前使用的数据库
db.dropDatabase()
- 查看当前数据库状态
db.stats()
- 查看当前数据库版本
db.version()
- 查看当前数据库连接机器地址
db.getMongo()
三、集合(表)
- 创建一个集合
db.createCollection("collName")
- 得到指定名称的集合
db.getCollection("collName")
- 查看当前数据库所有集合
db.getCollectionNames()
四、增删改查
- 向指定的集合中添加数据
db.yygh.save({name:'zf', age:18, sex:'男'});
yygh 添加数据的集合
- 查看集合中的所有数据
db.yygh.find()
- 条件查询
db.yygh.find({age:18});
- 条件查询只显示指定字段:类似于MySQL中的SELECT name, age FROM yygh WHERE name=‘zf’;
db.yygh.find({name:'zf'}, {'name':1, 'age':1});
- 查看一个方法的帮助
db.yygh.find().help()
- sort()对结果进行排序
db.yygh.find().sort({age:-1});
1为升序,-1为降序排列
- limit()读取指定数量的数据
db.yygh.find().limit(2);
- 拿到年龄最大的数据
db.yygh.find().sort({age:-1}).limit(1);
- skip()跳过指定数量的数据
db.yygh.find().skip(1)
- count()计数
db.yygh.find().count()
- 或查询$or:[](区分大小写)
db.yygh.find({$or:[{name:'zf'}, {age:20}]});
- 根据条件进行修改
db.yygh.update({name:'gy'}, {$set:{age:10, sex: '女'}});
update几个参数
db.collection.update(criteria, objNew, upsert, mult)
criteria:需要更新的条件表达式
objNew:更新表达式
upsert:如FI标记录不存在,是否插入新文档。
multi:是否更新多个文档
- 删除一条数据,删除后无法恢复
db.yygh.remove({age:25});
- 删除所有数据
db.yygh.remove({});
10. docker安装mysql
- 查看mysql资源
docker search mysql
- 拉取mysql镜像
docker pull mysql:5.7
- 查看mysql镜像
docker images
- 创建一个mysql数据库和配置文件my.cnf的地方
cd /usr/local
mkdir mysql5.7
cd mysql5.7
mkdir db
touch my.cnf
- my.cnf配置文件中粘贴如下内容
[mysqld]
user=mysql
sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
lower_case_table_names=1
event_scheduler=ON
default-time-zone = '+8:00'
event_scheduler=ON 表示开启事件支持
lower_case_table_names=1 表示数据库不区分大小写
default-time-zone = '+8:00' 表示使用中国时区
- mysql运行一个实例
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=abc -v /usr/local/mysql5.7/db:/var/lib/mysql -v /usr/local/mysql5.7/my.cnf:/etc/mysql/my.cnf --privileged=true -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
注意加上权限:--privileged=true
- 进入mysql容器
docker exec -ti mysql mysql -u root -pabc
第一个mysql是容器名
第二个mysql是客户端进入命令 mysql -u root -p
11. docker安装nacos
- 查看nacos镜像
docker search nacos
- 拉取nacos镜像
docker pull nacos/nacos-server
- 运行一个nacos实例
docker run -e MODE=standalone --name nacos -p 8848:8848 -d nacos/nacos-server
MODE=standalone 以单机模式启动
- 进入nacos内部
docker exec -ti nacos bash
- 访问nacos地址:localhost:8848/nacos(在虚拟机上就不是localhost)
12. Dockerfile
1. Docker镜像原理
- Docker镜像的本质是什么?(文件)
- Docker的centos的镜像只有200多MB,但是一个contos的ios文件有几个G?
- Docker的tomcat镜像有500多MB,但是一个tomcat安装包只有70多MB?
- Linux操作系统由进程调度子系统、进程通信子系统、内存管理子系统、文件管理子系统等组成。
- Linux的文件系统由bootfs和rootfs组成:
bootfs
:包含bootloader(引导加载程序)和kernel(内核) 组成。rootfs
:root文件系统,典型的Linux系统中的/dev,/bin等。- 不同的Linux发行版本(centos,ubuntu),bootfs基本一样,但是rootfs不同。
- docker镜像是由特殊的文件系统叠加而成。
- docker中的镜像(比如一个centos镜像)最底层还是使用宿主机的bootfs。
- 第二层是root文件系统rootfs,成为bash image。
- 在往上就可以叠加其他镜像。
- 我如果要修改,只能在最上层的基础上再加一层镜像。
2. 镜像制作
- 将容器转为镜像:挂载的文件不会保存到容器中
docker commit 容器id 镜像名称:版本号
- 将镜像转为压缩文件发送给别人
docker save -o 压缩文件名称 镜像名称:版本号
- 将压缩文件转为镜像
docker load -i 压缩文件的名称
- 制作一个自带配置文件的redis:/etc/redis/redis.conf
启动一个redis容器,进入容器
docker exec -it redis01 bash
再etc目录下创建一个redis目录
将redis.conf文件拷贝进去
docker cp redis.conf redis01:/etc/redis/redis.conf
将redis文件转为一个镜像
docker commit redis01 myreds:1.0
将镜像打包成压缩文件
docker save -o myredis.tar myredis:1.0
删除docker中的镜像
docker rmi myredis1.0
将压缩文件还原成镜像
docker load -i myredis.tar
3. Dockerfile
- Dockerfile是一个文本文件。
- 在基础镜像上构建出一个新的镜像。
- 可以模仿别人的Dockerfile文件,进行构建。
4. 使用Dockerfile自定义一个centos7
- 自定义centos7:1. 带vim(官方的不带vim)。2. 进入容器目录为/usr
- 拉取一个官方的centos7镜像。
docker pull centos:7
- 启动一个centos容器:
i
表示有命令交互,如[CMD]有命令/bin/bash进入容器,t
表示产生一个终端。
docker run -it --name centos7 -d centos:7
- 创建一个Dockerfile文件
// 定义父镜像
FROM centos:7
// 作者信息
MAINTAINER rhb
// 执行安装vim的命令
RUN yum install -y vim
// 进入容器时的工作目录
WORKDIR /usr
// 容器启动执行的命令
CMD /bin/bash
- 构建Dockerfile镜像
docker build -t mycentos:1.0 ./
13. SpringBoot应用打包到Docker进行部署
- 编写一个使用redis统计网站访问人数的应用。
@RestController
public class LookController {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@GetMapping("/hello")
public String hello() {
return "网站访问次数" + stringRedisTemplate.opsForValue().increment("i");
}
}
- properties文件
spring.redis.host=47.99.77.14
spring.redis.port=6380
spring.redis.password=1998927ren@
- maven install 打成jar包,上传到linux
- 编写一个Dockerfile文件,打包成docker镜像。
# 依赖与jdk8,docker会自己pull依赖
FROM openjdk:8-jdk-slim
# 将taget下面的jar复制到容器,重命名
COPY target/*.jar /app.jar
# 启动的命令
ENTRYPOINT ["java", "-jar", "/app.jar"]
- 在此目录下进行docker打包镜像:
如果Dockerfile命令 -f Dockerfile可以省略
。 ./表示在当前目录下构建,和Dockerfile中的路径保持一致
。
docker build -t java-demo:v1.0 -f Dockerfile ./
- 必须要在docker中安装redis,不能是宿主机安装redis,打包的java镜像不能和宿主机通信。
- 启动打包的镜像:
docker run --name java -p 8080:8080 -d java-demo:v1.0
14. 上传镜像到仓库
- 在Docker Hub上注册一个账号
- docker命令行登录:
docker login -u renhb -p 1998927ren
docker logout
-
创建一个docker仓库
-
将本地镜像打包,需要带上dockerId和仓库名称,打包成一个可以上传到仓库的新镜像。
docker tag java-demo:v1.0 renhb/java:v1.0
- push推送镜像到仓库
docker push renhb/java:v1.0