文章目录
- 1. 安装
- 1.1 使用官方安装脚本自动安装 (仅适用于公网环境)
- 1.2手动安装帮助 (阿里云ECS可以通过内网安装,见注释部分内容)
- Ubuntu 14.04 16.04 (使用apt-get进行安装)
- CentOS 7 (使用yum进行安装)
- 2.常用命令
- 1.帮助启动类
- 2.镜像命令
- 3.容器命令
- 4.总结
- 3.docker镜像
- 3.1 是什么
- 3.1.1 分层的下载
- 3.1.2 UnionFS(联合文件系统)
- 3.1.3 Docker镜像加载原理
- 3.2 重点理解
- 3.3 镜像Commit操作案例
- 4.本地镜像发布到阿里云
- 4.1 先创建一个命名空间
- 4.2 创建创库名称
- 4.3 进入管理界面获得脚本
- 5.本地镜像发布到私有库
- 5.1 下载镜像Docker Registry
- 5.2 运行私有库Registry,相当于本地私有Docker hub
- 5.3 案例演示,创建一个新镜像,Ubuntu安装ifconfig命令
- 5.4 安装完成后,commit我们的新镜像
- 5.5 curl验证私服上有什么镜像
- 5.6 将新镜像修改为符合私服规范的Tag
- 5.7 修改配置文件使之私服可以支持http
- 5.8 curl验证私服上有什么镜像
- 5.9 pull到本地并运行
- 6.docker容器数据卷
- 6.1 **容器卷记得加入**
- 6.2 是什么
- 6.3 实例
- 6.4 读写规则映射添加说明
- 6.5 卷的继承和共享
- 7.Docker常见软件安装
- 7.1 总体步骤
- 7.2 安装Tomcat
- 7.3 安装Mysql
- 7.3.1 简单版(会产生的问题)
- 7.3.2 实战版
- 7.4 安装Redis
1. 安装
官方安装地址文档
使用该命令先卸载原来可能安装的docker
sudo apt-get remove docker docker-engine docker.io containerd runc
1.1 使用官方安装脚本自动安装 (仅适用于公网环境)
curl -fsSL https://get.docker | bash -s docker --mirror Aliyun
1.2手动安装帮助 (阿里云ECS可以通过内网安装,见注释部分内容)
Ubuntu 14.04 16.04 (使用apt-get进行安装)
# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL http://mirrors.aliyun/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装 Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce
注意:其他注意事项在下面的注释中
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# apt-cache madison docker-ce
# docker-ce | 17.03.1~ce-0~ubuntu-xenial | http://mirrors.aliyun/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# docker-ce | 17.03.0~ce-0~ubuntu-xenial | http://mirrors.aliyun/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# Step 2: 安装指定版本的Docker-CE: (VERSION 例如上面的 17.03.1~ce-0~ubuntu-xenial)
# sudo apt-get -y install docker-ce=[VERSION]
# 通过经典网络、VPC网络内网安装时,用以下命令替换Step 2、Step 3中的命令
# 经典网络:
# curl -fsSL http://mirrors.aliyuncs/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyuncs/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# VPC网络:
# curl -fsSL http://mirrors.cloud.aliyuncs/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# sudo add-apt-repository "deb [arch=amd64] http://mirrors.cloud.aliyuncs/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
CentOS 7 (使用yum进行安装)
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并安装 Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start
注意:其他注意事项在下面的注释中
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,你可以通过以下方式开启。同理可以开启各种测试版本等。
# vim /etc/yum.repos.d/docker-ce.repo
# 将 [docker-ce-test] 下方的 enabled=0 修改为 enabled=1
#
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
# Loading mirror speeds from cached hostfile
# Loaded plugins: branch, fastestmirror, langpacks
# docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable
# docker-ce.x86_64 17.03.1.ce-1.el7.centos @docker-ce-stable
# docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
# Available Packages
# Step2 : 安装指定版本的Docker-CE: (VERSION 例如上面的 17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]
# 注意:在某些版本之后,docker-ce安装出现了其他依赖包,如果安装失败的话请关注错误信息。例如 docker-ce 17.03 之后,需要先安装 docker-ce-selinux。
# yum list docker-ce-selinux- --showduplicates | sort -r
# sudo yum -y install docker-ce-selinux-[VERSION]
# 通过经典网络、VPC网络内网安装时,用以下命令替换Step 2中的命令
# 经典网络:
# sudo yum-config-manager --add-repo http://mirrors.aliyuncs/docker-ce/linux/centos/docker-ce.repo
# VPC网络:
# sudo yum-config-manager --add-repo http://mirrors.could.aliyuncs/docker-ce/linux/centos/docker-ce.repo
阿里云镜像加速
2.常用命令
1.帮助启动类
启动docker:syatemctl start docker
停止docker:systemctl spot docker
重启docker:systemctl restart docker
查看docker状态:systemctl status docker
开机启动:systemctl enable docker
查看docker概要信息:docker info
查看docker的总帮助文档:docker --help
查看docker的命令帮组文档:docker 具体命令 --help
2.镜像命令
列出本地主机上的镜像:docker images
-a (列出本地的所有镜像(含有历史镜像层))
-q (只显示镜像id)
查看远程仓库是否存在某个镜像:docker search [OPTIONS] 镜像名字
下载镜像:docker pull 镜像名字[:TAG(镜像的标签版本号)] 例: docker pull redis:6.0.8 查看镜像/容器/数据卷所占用的空间:docker system df 删除镜像:docker rmi 镜像名字ID docker rmi -f 镜像ID (删除单个) docker rmi -f 镜像名1 镜像名2 ... (删除多个) docker rmi -f $(docker images -qs) (删除全部 注:**很危险!!**) 面试题:谈谈docker的虚悬镜像是什么? 仓库名、镜像名都是\的镜像俗称虚悬镜像
–limit N (只列出前N个镜像)
例: docker search --limit 5 redis
3.容器命令
先创建一个Ubuntu的镜像
新建+启动容器:docker run [OPTIONS] IMAGE [COMMANGE] [ARG…]
OPTIONS说明:有些是一个减号,有些是连个减号
–name=“新名字” :为容器指定一个名称
-d: 后台运行容器并返回容器ID,也即启动守护式容器(后台运行);
-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;也即启动交互式容器(前台有伪终端,等待交互);
-P: 随机端口映射,大写P
-p: 指定端口映射,小写p
前台交互式启动例如:docker run -it redis:6.0.8
后台守护式启动例如:docker run -t redis:6.0.8
列出当前所有正在运行的容器:docker ps [OPTIONS]
-a:列出当前所有正在运行的容器+历史上运行过的
-l:显示最近创建的容器
-n 数字:显示最近创建的(数字)个镜像
-q:静默模式,只显示容器编号
退出容器
exit:run进去容器,exit退出,容器停止
ctrl+p+q:run进去容器,ctrl+p+q退出,容器不会停止
启动已经停止的容器
docker start 容器id或容器名
重启容器
docker restart 容器id或容器名
停止容器
docker stop 容器id或容器名
强制停止容器
docker kill 容器id或容器名
删除已经停止的容器
docker rm 容器id
一次性删除多个容器实例(危险!!)
docker rm -f $(docker ps -a -q)
docker ps -a -q | xages docker rm
重要:
启动守护式容器(后台服务器)
在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过 -d 指定容器的后台运行模式。
docker run -d 容器名
使用镜像centos:latest以后台模式启动一个容器
docker run -d centos
问题:然后docker ps -a 进行查看, 会发现容器已经退出
很重要的要说明的一点: Docker容器后台运行,就必须有一个前台进程.
容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。
这个是docker的机制问题,比如你的web容器,我们以nginx为例,正常情况下,
我们配置启动服务只需要启动响应的service即可。
例如service nginx start
但是,这样做,nginx为后台进程模式运行,就导致docker前台没有运行的应用,
这样的容器后台启动后,会立即自杀因为他觉得他没事可做了.
所以,最佳的解决方案是,将你要运行的程序以前台进程的形式运行,
常见就是命令行模式,表示我还有交互操作,别中断,O(∩_∩)O哈哈~
redis 前后台启动演示case
前台交互式启动例如:docker run -it redis:6.0.8
后台守护式启动例如:docker run -t redis:6.0.8
查看容器日志
docker logs 容器id
查看容器内运行的进程
docker top 容器id
查看容器内部细节
docker inspect 容器id
进入正在运行的容器并以命令交互
docker exec -it 容器ID bashShell
docker attach 容器ID
区别:attach 直接进入容器启动命令的终端,不会启动新的进程,用exit退出,会导致容器的停止。
exec 是在容器中打开新的终端,并且可以启动新的进程,用exit退出,不会导致容器的停止。
推荐大家使用 docker exec 命令,因为退出容器终端,不会导致容器的停止。
例如:docker exec -it redis /bin/bash
从容器内拷贝文件到主机上
容器 -> 主机
docker cp 容器ID:容器内地址 目的主机地址
导入和导出容器
export 导出容器的内容留作为一个tar归档文件[对应import命令]
import 从tar包中的内容创建一个新的文件系统再导入为镜像[对应export]
案例:
docker export 容器ID > 文件名.tar
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
4.总结
attach Attach to a running container # 当前 shell 下 attach 连接指定运行镜像
build Build an image from a Dockerfile # 通过 Dockerfile 定制镜像
commit Create a new image from a container changes # 提交当前容器为新的镜像
cp Copy files/folders from the containers filesystem to the host path #从容器中拷贝指定文件或者目录到宿主机中
create Create a new container # 创建一个新的容器,同 run,但不启动容器
diff Inspect changes on a container's filesystem # 查看 docker 容器变化
events Get real time events from the server # 从 docker 服务获取容器实时事件
exec Run a command in an existing container # 在已存在的容器上运行命令
export Stream the contents of a container as a tar archive # 导出容器的内容流作为一个 tar 归档文件[对应 import ]
history Show the history of an image # 展示一个镜像形成历史
images List images # 列出系统当前镜像
import Create a new filesystem image from the contents of a tarball # 从tar包中的内容创建一个新的文件系统映像[对应export]
info Display system-wide information # 显示系统相关信息
inspect Return low-level information on a container # 查看容器详细信息
kill Kill a running container # kill 指定 docker 容器
load Load an image from a tar archive # 从一个 tar 包中加载一个镜像[对应 save]
login Register or Login to the docker registry server # 注册或者登陆一个 docker 源服务器
logout Log out from a Docker registry server # 从当前 Docker registry 退出
logs Fetch the logs of a container # 输出当前容器日志信息
port Lookup the public-facing port which is NAT-ed to PRIVATE_PORT # 查看映射端口对应的容器内部源端口
pause Pause all processes within a container # 暂停容器
ps List containers # 列出容器列表
pull Pull an image or a repository from the docker registry server # 从docker镜像源服务器拉取指定镜像或者库镜像
push Push an image or a repository to the docker registry server # 推送指定镜像或者库镜像至docker源服务器
restart Restart a running container # 重启运行的容器
rm Remove one or more containers # 移除一个或者多个容器
rmi Remove one or more images # 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]
run Run a command in a new container # 创建一个新的容器并运行一个命令
save Save an image to a tar archive # 保存一个镜像为一个 tar 包[对应 load]
search Search for an image on the Docker Hub # 在 docker hub 中搜索镜像
start Start a stopped containers # 启动容器
stop Stop a running containers # 停止容器
tag Tag an image into a repository # 给源中镜像打标签
top Lookup the running processes of a container # 查看容器中运行的进程信息
unpause Unpause a paused container # 取消暂停容器
version Show the docker version information # 查看 docker 版本号
wait Block until a container stops, then print its exit code # 截取容器停止时的退出状态值
3.docker镜像
3.1 是什么
是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。
只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。
3.1.1 分层的下载
以我们的pull为例,在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载
3.1.2 UnionFS(联合文件系统)
Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
3.1.3 Docker镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
平时我们安装进虚拟机的CentOS都是好几个G,为什么docker这里才200M?
对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供 rootfs 就行了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用bootfs。
3.2 重点理解
Docker镜像层都是只读的,容器层是可写的
当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。
3.3 镜像Commit操作案例
docker commit提交容器副本使之成为一个新的镜像
docker commit -m=“提交的描述信息” -a=“作者” 容器ID要创建的目标镜像名:[标签名]
案例:Ubuntu安装vim
apt-get update 先更新我们的包管理工具 apt-get -y install vim 安装我们需要的vim
commit我们的新镜像
docker commit -m="add vim cmd" -a="xxx" d96edeabd6b6 xxx/myubun:1.3
4.本地镜像发布到阿里云
4.1 先创建一个命名空间
阿里云登录->工作台->菜单中找到容器镜像服务->实例列表->个人实例->命名空间->创建命名空间
4.2 创建创库名称
镜像仓库-> 创建镜像仓库
4.3 进入管理界面获得脚本
5.本地镜像发布到私有库
5.1 下载镜像Docker Registry
5.2 运行私有库Registry,相当于本地私有Docker hub
docker run -d -p 5000:5000 -v /xxx/myregistry/:/tmp/registry --privileged=true registry
5.3 案例演示,创建一个新镜像,Ubuntu安装ifconfig命令
docker commit -m="add ifconfig" -a="xxx" ac7a7a71e7ce myubun:1.4
5.4 安装完成后,commit我们的新镜像
docker commit -m="add ifconfig" -a="xxx" ac7a7a71e7ce myubun:1.4
5.5 curl验证私服上有什么镜像
[root@centos01 xxx]# curl -XGET http://192.168.75.130:5000/v2/_catalog
{"repositories":[]}
5.6 将新镜像修改为符合私服规范的Tag
按照公式: docker tag 镜像:Tag Host:Port/Repository:Tag
[root@centos01 xxx]# docker tag myubun:1.4 192.168.75.130:5000/myubun:1.4
5.7 修改配置文件使之私服可以支持http
修改前
[root@centos01 xxx]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://y9uvrs7a.mirror.aliyuncs"]
}
修改后
[root@centos01 xxx]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://y9uvrs7a.mirror.aliyuncs"],
"insecure-registries": ["192.168.75.130:5000"]
}
[root@centos01 xxx]# docker push 192.168.75.130:5000/myubun:1.4
The push refers to repository [192.168.75.130:5000/myubun]
64cdb6d21c1d: Pushed
9f54eef41275: Pushed
1.4: digest: sha256:55517657f747fd9b725660b024ccbe98fd83045c1e4600e5f43d030b97fe0dbd size: 741
5.8 curl验证私服上有什么镜像
[root@centos01 xxx]# curl -XGET http://192.168.75.130:5000/v2/_catalog
{"repositories":["myubun"]}
5.9 pull到本地并运行
[root@centos01 xxx]# docker pull 192.168.75.130:5000/myubun:1.4
1.4: Pulling from myubun
7b1a6ab2e44d: Already exists
c1573538fb63: Already exists
Digest: sha256:55517657f747fd9b725660b024ccbe98fd83045c1e4600e5f43d030b97fe0dbd
Status: Downloaded newer image for 192.168.75.130:5000/myubun:1.4
192.168.75.130:5000/myubun:1.4
6.docker容器数据卷
6.1 容器卷记得加入
Docker挂载主机目录访问如果出现cannot open directory .: Permission denied
解决办法:在挂载目录后多加一个–privileged=true参数即可
如果是CentOS7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为,
在SELinux里面挂载目录被禁止掉了额,如果要开启,我们一般使用–privileged=true命令,扩大容器的权限解决挂载目录没有权限的问题,也即
使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限。
6.2 是什么
有点类似我们Redis里面的rdb和aof文件
将docker容器内的数据保存进宿主机的磁盘中
运行一个带有容器卷存储功能的容器实例
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
6.3 实例
[root@centos01 xxx]# docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data --name=u1 ubuntu root@dbc00e41c624:/# cd tmp root@dbc00e41c624:/tmp# ls docker_data root@dbc00e41c624:/tmp# cd docker_data root@dbc00e41c624:/tmp/docker_data# ls root@dbc00e41c624:/tmp/docker_data# touch dockerin.txt bash: cd: tmp: 没有那个文件或目录 [root@centos01 xxx]# cd /tmp [root@centos01 tmp]# cd host_data [root@centos01 host_data]# ls dockerin.txt
主机 [root@centos01 host_data]# touch host.txt [root@centos01 host_data]# ls dockerin.txt host.txt [root@centos01 host_data]# echo 'hello docker ' > host.txt 容器 root@dbc00e41c624:/tmp/docker_data# ls dockerin.txt host.txt root@dbc00e41c624:/tmp/docker_data# vi host.txt bash: vi: command not found root@dbc00e41c624:/tmp/docker_data# cat host.txt hello docker
此时使用
docker inspect 容器ID
可以看到"Mounts": [ { "Type": "bind", "Source": "/tmp/host_data", "Destination": "/tmp/docker_data", "Mode": "", "RW": true, "Propagation": "rprivate" } ],
docker容器stop,主机修改,docker容器重启看数据是否同步。
6.4 读写规则映射添加说明
默认是可读可写的
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名
容器内部被限制,只能读不能写
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
[root@centos01 host_data]# docker run -it --privileged=true -v /mydocker/u:/tmp/u:ro --name=u2 ubuntu root@e632e917439c:/# cd /tmp root@e632e917439c:/tmp# ls root@e632e917439c:/tmp/u# touch a.txt touch: cannot touch 'a.txt': Read-only file system root@e632e917439c:/tmp/u# ls b.txt [root@centos01 u]# touch b.txt
6.5 卷的继承和共享
容器1完成和宿主机之间的映射
主机
[root@centos01 u]# rm -rf b.txt
[root@centos01 u]# ls
[root@centos01 u]# touch u1ubuntu.txt
[root@centos01 u]# ls
u1ubuntu.txt
[root@centos01 u]# ls
host.txt u1ubuntu.txt
容器1
[root@centos01 xxx]# docker run -it --privileged=true -v /mydocker/u:/tmp/u --name=u1 ubuntu
root@7099922c768b:/# cd /tmp/u
root@7099922c768b:/tmp/u# ls
u1ubuntu.txt
root@7099922c768b:/tmp/u# touch host.txt
root@7099922c768b:/tmp/u# ls
host.txt u1ubuntu.txt
容器2继承容器1的卷规则
docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu
容器2
[root@centos01 xxx]# docker run -it --privileged=true --volumes-from u1 --name u2 ubuntu
root@d6b977f1604f:/# cd /tmp/u
root@d6b977f1604f:/tmp/u# ls
host.txt u1ubuntu.txt
root@d6b977f1604f:/tmp/u# touch u2.txt
root@d6b977f1604f:/tmp/u# ls
host.txt u1ubuntu.txt u2.txt
root@d6b977f1604f:/tmp/u# ls
h1.txt host.txt u1ubuntu.txt u2.txt
容器1
root@7099922c768b:/tmp/u# ls
host.txt u1ubuntu.txt u2.txt
root@7099922c768b:/tmp/u# [root@centos01 xxx]#
[root@centos01 xxx]# docker exec -it 7099922c768b /bin/bash
root@7099922c768b:/# cd /tmp/u
root@7099922c768b:/tmp/u# ls
h1.txt host.txt u1ubuntu.txt u2.txt
主机
[root@centos01 u]# ls
host.txt u1ubuntu.txt u2.txt
[root@centos01 u]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d6b977f1604f ubuntu "bash" 45 minutes ago Up 15 minutes u2
7099922c768b ubuntu "bash" 54 minutes ago Up 14 minutes u1
[root@centos01 u]# docker stop 7099922c768b
7099922c768b
[root@centos01 u]# touch h1.txt
[root@centos01 u]# ls
h1.txt host.txt u1ubuntu.txt u2.txt
[root@centos01 u]# docker start 7099922c768b
7099922c768b
7.Docker常见软件安装
7.1 总体步骤
1.搜索镜像
2.拉取镜像
3.查看镜像
4.启动镜像
5.停止镜像
6.移除镜像
7.2 安装Tomcat
- docker hub上面查找tomcat镜像
docker search tomcat
- 从docker hub上拉取tomcat镜像到本地
docker pull tomcat
docker images查看是否有拉取到的tomcat
使用tomcat镜像创建容器实例(也叫运行镜像)
问题:出现404: 解决:1.可能没有关闭防火墙 2.把webapps.dist目录换成webapps
访问tomcat首页
免修改版
安装tomcat8 docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8
7.3 安装Mysql
7.3.1 简单版(会产生的问题)
- docker hub上面查找mysql镜像
- 从docker hub上(阿里云加速器)拉取mysql镜像到本地标签为5.7
- 使用mysql5.7镜像创建容器(也叫运行镜像)
[root@centos01 u]# docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 [root@centos01 u]# docker exec -it 248d2cd84e37 /bin/bash root@248d2cd84e37:/# mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.7.36 MySQL Community Server (GPL) Copyright (c) 2000, 2021, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec) mysql> create database db01; Query OK, 1 row affected (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | db01 | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.01 sec) mysql> use db01 Database changed mysql> create table t1(id int,name varchar(12)); Query OK, 0 rows affected (0.01 sec) mysql> insert into t1 values(1,"zhangsan"); Query OK, 1 row affected (0.01 sec) mysql> select * from t1; +------+----------+ | id | name | +------+----------+ | 1 | zhangsan | +------+----------+ 1 row in set (0.00 sec)
- win连接Mysql
- 问题
1. 为什么插入中文会报错? docker上默认字符集的问题 mysql> show variables like 'character%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.01 sec) 2. 删除容器后,mysql里的数据怎么办?
7.3.2 实战版
- 创建Mysql容器实例
完整命令(执行): docker run -d -p 3306:3306 --privileged=true -v /mydocker/mysql/log:/var/log/mysql -v /mydocker/mysql/data:/var/lib/mysql -v /mydocker/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7 整理命令(分析): docker run -d -p 3306:3306 --privileged=true #开启权限 -v /mydocker/mysql/log:/var/log/mysql #添加容器卷 -v /mydocker/mysql/data:/var/lib/mysql -v /mydocker/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 #设置密码 --name mysql #设置名称 mysql:5.7 #镜像名
- 新建myf
通过容器卷同步给mysql容器实例
[root@centos01 /]# cd /mydocker/mysql/conf [root@centos01 conf]# ls -l 总用量 0 [root@centos01 conf]# vi myf 添加以下配置后,保存退出: [client] default_character_set=utf8 [mysqld] collation_server = utf8_general_ci character_set_server = utf8
- 重启mysql容器实例
[root@centos01 conf]# docker restart mysql mysql [root@centos01 conf]# docker exec -it mysql /bin/bash root@5e25fabd39ab:/# mysql -uroot -p Enter password: ... mysql> show variables like 'character%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec) mysql> create database db01; Query OK, 1 row affected (0.00 sec) mysql> use db01; Database changed mysql> create table t1(id int,name varchar(12)); Query OK, 0 rows affected (0.01 sec) mysql> insert into t1 values(1,'zhangsan'); Query OK, 1 row affected (0.00 sec) mysql> select * from t1; +------+----------+ | id | name | +------+----------+ | 1 | zhangsan | | 2 | 王五 | +------+----------+ 2 rows in set (0.00 sec)
- 结论
之前的DB 无效
修改字符集操作+重启mysql容器实例
之后的DB 有效,需要新建
结论:docker安装完MySQL并run出容器后,建议请先修改完字符集编码后再新建mysql库-表-插数据
- 测试
测试直接删除mysql容器,重新启动一个mysql容器,查看数据是否还存在
[root@centos01 xxx]# docker rm -f mysql mysql [root@centos01 xxx]# docker run -d -p 3306:3306 --privileged=true -v /mydocker/mysql/log:/var/log/mysql -v /mydocker/mysql/data:/var/lib/mysql -v /mydocker/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7 d8a67c31b8692489f0590266d0d1e6114598771abd0138613324853f1c07d378 [root@centos01 xxx]# docker exec -it mysql /bin/bash root@d8a67c31b869:/# mysql -uroot -p Enter password: ... mysql> use db01; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> select * from t1; +------+----------+ | id | name | +------+----------+ | 1 | zhangsan | | 2 | 王五 | +------+----------+ 2 rows in set (0.00 sec)
7.4 安装Redis
- 从docker hub上(阿里云加速器)拉取redis镜像到本地
- 在宿主机下创建 /app/redis目录
- 在/app/redis目录下创建redis.conf文件并修改
3.1 开启redis验证 可选
例如: requirepass 123
3.2 允许redis外地连接 必须
注释掉 # bind 127.0.0.1
3.3 daemonize no
将daemonize yes注释起来或者 daemonize no设置,因为该配置和docker run中-d参数冲突,会导致容器一直启动失败
3.4 开启redis数据持久化 appendonly yes 可选
- 使用镜像创建容器
docker run -p 6379:6379 --name redis --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data -d redis redis-server /etc/redis/redis.conf #读取我们修改好的配置 完整命令: docker run -p 6379:6379 --name redis --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data -d redis redis-server /etc/redis/redis.conf
[root@centos01 redis]# docker run -p 6379:6379 --name redis --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data -d redis redis-server /etc/redis/redis.conf ed11411e3cddd564ce2c65b28782aa22bcdd564e5bd4712ec7f08566f6d10a5b [root@centos01 redis]# docker exec -it redis /bin/bash root@ed11411e3cdd:/data# redis-cli 127.0.0.1:6379> set k1 v1 (error) NOAUTH Authentication required. 127.0.0.1:6379> auth 123456 OK 127.0.0.1:6379> set k1 v1 OK
更多推荐
Docker学习笔记(一)--基础篇
发布评论