赞
踩
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
使用Docker,配置工作从资源管理中分离了出来,而部署工作则不值一提:执行docker run,环境的镜像会被拉取下来并准备运行,所消耗的资源更少并且是内含的,因此不会干扰其他环境。
Docker 包括三个基本概念:
Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。
前置文章:linux云服务器配置及Docker安装Mysql、Redis
#卸载旧版本
sudo apt-get remove docker docker-engine docker.io
# 安装包更新
sudo apt-get update
# 安装依赖
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
# 加Docker官方GPG key
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
#设置稳定版的Docker仓库
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
#安装 docker-ce
sudo apt-get install -y docker-ce
#查看是否安装成功
docker version
出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。
因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。
#建立 docker 组:
sudo groupadd docker
# 将当前用户加入 docker 组:
sudo usermod -aG docker $USER
#更新用户组
newgrp docker
#测试docker命令是否可以使用sudo正常使用
docker ps
docker version #查看docker的版本信息
docker info #查看docker的系统信息
docker 命令 --help #帮助命令(可查看可选的参数)
docker COMMAND --help
#解释:
1.REPOSITORY 镜像的仓库源
2.TAG 镜像的标签
3.IMAGE ID 镜像的id
4.CREATED 镜像的创建时间
5.SIZE 镜像的大小
可选参数
- a/--all
列出所有镜像
- q/--quiet
只显示镜像的id
docker search tomcat
ubuntu@VM-8-4-ubuntu:~$ docker pull tomcat:8
8: Pulling from library/tomcat
9d19ee268e0d: Pull complete
f2b566cb887b: Pull complete
b375e6654ef5: Pull complete
19452d1108a6: Pull complete
b82f37793aff: Pull complete
05e2d15aa7f6: Pull complete
c13582f40375: Pull complete
Digest: sha256:f7ec6fbad076aeb902b8b3f0b13fa5296882759d7bd21d7ef7017c76c0bd4f20
Status: Downloaded newer image for tomcat:8
docker.io/library/tomcat:8
docker pull tomcat:9
docker rmi tomcat:9
docker rmi tomcat:8
docker rm 容器id
#删除指定的容器,不能删除正在运行的容器
强制删除使用docker rm -f
-a
# 列出所有容器 用的非常多的一个参数
-n=?
# 显示最近创建的n个容器
-q
# 只显示容器的编号
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前运行的容器
docker kill 容器id #强制停止当前容器(了解)
Docker run 命令用来创建一个新的容器并运行,相当于 docker create和docker start的组合。
docker run [可选参数] image
#参数说明
--name="名字" 指定容器名字
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口(-p ip:主机端口:容器端口 配置主机端口映射到容器端口-p 主机端口:容器端口-p 容器端口)
-p 3306:3306
-P 随机指定端口(大写的P)
先查看端口是否被占用
lsof -i:6379
docker run --name some-redis -d -it -p 6379:6379 redis --requirepass "mimapassword" --appendonly yes
如果当前容器中得程序出现了一些bug, 此时会用docker logs 容器名
去查看容器内部的日志
docker top 容器名称
docker exec 进入容器后开启一个新的终端,可以在里面操作
docker容器系统的重要特点: 如果当前容器系统中没有任何一个正在运行的程序, 该系统会被自动关机退出
输入exit
后就会退出容器
具体使用详见本篇文章【四、数据卷安装mysql】
发现其中数据卷占用空间很大, 并且可回收空间也大,使用命令回收不再使用的数据卷
docker volume prune
注意:password 改为自己想要设置的数据库密码
docker run --name some-secret-mysql -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password mysql:5.7 --default_storage_engine=InnoDB --lower_case_table_names=1 --max_allowed_packet=50M --character-set-server=utf8mb4 --sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
当2-3分钟之后, 输入docker ps
回车
查看到类似内容表示mysql安装成功
b8942c6f086a mysql:5.7 "docker-entrypoint.s…" 17 seconds ago Up 11 seconds 33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp some-secret-mysql
docker exec -it some-mysql8 bash
mysql -uroot -proot
mysql -uroot -pmimapassword
设置远程连接
navicate for mysql 远程连接 use mysql; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'; FLUSH PRIVILEGES; 修改密码为永不过期 ALTER USER 'root'@'%' IDENTIFIED BY 'Jw1182-0c1' PASSWORD EXPIRE NEVER; 修改密码并指定加密规则为 mysql_native_password ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'Jw1182-0c1'; 刷新权限 FLUSH PRIVILEGES; 这样就可以远程连接数据库了;
ls /var/lib/mysql
查看容器目录:数据库和数据卷存放在/var/lib/mysql
目录下
同时云服务器需要保证已经开放了3306端口。
之后可以借助第三方工具去测试连接mysql。
关于数据卷安装mysql请看本篇文章【四、使用数据卷安装mysql(重要)】
先查看端口是否被占用
lsof -i:6379
docker run --name some-redis -d -it -p 6379:6379 redis --requirepass "mimapassword" --appendonly yes
docker ps
关于Redis详见文章【redis】(一)使用docker安装redis、常用五大基本数据类型、Jedis操作Redis、Spring整合Redis
docker run -dit --name some-clickhouse -e CLICKHOUSE_DB=test1 -e CLICKHOUSE_USER=root -e CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT=1 -e CLICKHOUSE_PASSWORD=password123 -p 9000:9000 -p 8123:8123 clickhouse/clickhouse-server
用户名root,密码password123,连接端口8123(记得防火墙开放端口)
关于clickhouse详见文章ClickHouse入门及安装、OLAP、列式数据库
注:因为mysql容器一旦销毁,数据库也就随之销毁,为了解决这个问题,docker官方提出了容器数据卷技术,就是在宿主机上新建一些目录与容器内的目录映射,当容器销毁时,宿主机上的目录文件不会消失,依然存在。
卷就是目录或文件,存在于一个或多个容器中,由Docker挂载到容器,但卷不属于联合文件系统(Union FileSystem),因此能够绕过联合文件系统提供一些用于持续存储或共享数据的特性:。
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
数据卷是被设计用来持久化数据的,它的生命周期独立于容器,Docker 不会在容器被删除后自动删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷 。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 docker rm -v
这个命令。
数据卷的特点:
无主的数据卷可能会占据很多空间,要清理请使用以下命令
$ docker volume prune
docker run --name some-mysql8 -d -v /home/ubuntu/it23/mysql8datadir:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mimapassword mysql:8 --default_storage_engine=InnoDB --lower_case_table_names=1 --max_allowed_packet=50M --character-set-server=utf8mb4
–name some-mysql8: 为容器指定一个名称; –name some-mysql8
:指定容器名字为some-mysql8,也可以不指定,不指定会给容器默认制定一个名字
-d: 后台运行容器,并返回容器ID;
–volume , -v: 绑定一个卷 -v /home/ubuntu/it23/mysql8datadir:/var/lib/mysql
:对宿主机数据库目录与容器数据库目录进行映射挂载。意思就是将mysql容器中的/var/lib/mysql
(这个是数据库所有数据信息文件)映射到宿主机/it23/mysql8datadir
里面。
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口 将宿主机3306端口与容器3306端口做映射
-e : 设置环境变量;MYSQL_ROOT_PASSWORD
为mysql的root用户设置密码。
查看容器对应元数据docker inspect 容器id
,可以在Mounts节点查看建立的数据卷信息。
此时可以直接从宿主机查看到数据库222a里的内容
然后删除容器,宿主机中的相关文件夹依旧存有数据库
再次使用相同命令安装mysql8容器,重新安装之后,新数据库里面依旧会存有数据(此时数据库文件由宿主机→容器)
docker run --name some-mysql8 -d -v /home/ubuntu/it23/mysql8datadir:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mimapassword mysql:8 --default_storage_engine=InnoDB --lower_case_table_names=1 --max_allowed_packet=50M --character-set-server=utf8mb4
/it23/mysql8datadir
是空的。是docker容器中的/var/lib/mysql
会自动映射到宿主机/it23/mysql8datadir
,让宿主机有了对应的文件信息。/it23/mysql8datadir
是有文件的。然后创建了mysql容器,并设置对应的映射关系。这时,宿主机的/it23/mysql8datadir
文件映射到了容器中,保持数据一致。
- 当指定-v参数时,在启动容器时会首先检查宿主机中是否有数据文件:
- 如果有的话,则判断是否是数据库文件,如果符合数据库文件系统的文件目录。那么则会使用;如果不符合数据库文件系统的文件目录,那么则会无法启动,直接报错。
- 如果没有的话则会初始化数据库文件,生成一个干净的数据库系统并进行宿主机和docker容器间的互通。
删除当前容器并且删除文件夹mysql8datadir,重新创建mysql8容器(不使用数据卷命令)。
docker run --name some-mysql8 -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mimapassword mysql:8 --default_storage_engine=InnoDB --lower_case_table_names=1 --max_allowed_packet=50M --character-set-server=utf8mb4
在当前mysql容器中新建一个数据库newworld
,并新建一张表sun
,在表中插入一条数据来模拟旧的数据库数据。
匿名挂载就是在指定数据卷的时候,不指定容器路径对应的主机路径,这样对应映射的主机路径就是默认的路径/var/lib/docker/volumes/
中自动生成一个随机命名的文件夹。
使用docker volume ls
查看所有的数据卷volume的情况, VOLUME NAME
这里的值是真实存在的目录。
这些数据卷称为匿名数据卷,可以根据时间来选择数据卷,然后根据数据卷ID查看详细内容。
docker inspect 数据卷id
查看该数据卷的详细信息,找到数据卷所在文件夹。
切换到root用户然后访问数据卷所在文件夹。根据时间来选择数据卷
进入该目录下,发现有一个_data
文件夹,再次切换到该文件夹里面进行查看,发现有刚刚创建的数据库newworld
使用pwd
获取当前目录,然后切换回普通用户将该目录复制到新文件夹中。
sudo cp -r /var/lib/docker/volumes/b6aaa127bc2071bcc94c51b6fcc0be33ffa23c32f10d7ea20c586f84bad9d9cb/_data mysql8datadir
再次使用数据卷命令创建新的mysql8容器
docker run --name some-mysql8 -d -v /home/ubuntu/it23/mysql8datadir:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mimapassword mysql:8 --default_storage_engine=InnoDB --lower_case_table_names=1 --max_allowed_packet=50M --character-set-server=utf8mb4
匿名数据卷会占用一些磁盘空间,使用
docker system df
查看。发现其中数据卷占用空间很大, 并且可回收空间也大,使用命令
docker volume prune
回收不再使用的数据卷。
docker pull ubuntu:18.04
docker run --name some-jdk -dit ubuntu:18.04 /bin/bash
docker top some-jdk
发现此时运行了一个黑窗口程序
进入容器后查看当前系统版本uname -a
首先apt update -y
apt serach openjdk
安装jre-headless: apt install -y openjdk-8-jdk-headless
成功安装:java -version
生成镜像docker commit some-jdk yolo01/openjdk-jdk:8
查看镜像docker images
删除刚刚的容器
docker run --name some-jdk2 yolo01/openjdk-jdk:8 /bin/bash
登陆docker账号docker login
docker push yolo01/openjdk-jdk:8
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。