docker的安装
-
查看系统版本
[root@iz2ze9n36uysr6g8wtg6nsz /]# cat /etc/os-release NAME="CentOS Linux" VERSION="7 (Core)" ID="centos" ID_LIKE="rhel fedora" VERSION_ID="7" PRETTY_NAME="CentOS Linux 7 (Core)" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:centos:centos:7" HOME_URL="https://www.centos.org/" BUG_REPORT_URL="https://bugs.centos.org/" CENTOS_MANTISBT_PROJECT="CentOS-7" CENTOS_MANTISBT_PROJECT_VERSION="7" REDHAT_SUPPORT_PRODUCT="centos" REDHAT_SUPPORT_PRODUCT_VERSION="7"
-
安装docker
查看帮助文档https://docs.docker.com/engine/install/centos/
#1.卸载之前的docker
#2.安装必要的包
sudo yum install -y yum-utils
#3.设置阿里云镜像地址
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#4.更新yum软件包索引
yum makecache fast
#5.安装docker
sudo yum install docker-ce docker-ce-cli containerd.io
#6.启动docker
sudo systemctl start docker
#7.运行测试的helloword镜像
sudo docker run hello-world
#查看所有的镜像
docker images
#
# 查看docker版本
docker verison
#阿里云镜像加速
#1.登录阿里云,找到容器镜像服务-》镜像加速器,以后安装将很快
#2.配置使用
#针对Docker客户端版本大于 1.10.0 的用户
#您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://olrf6dso.mirror.aliyuncs.com"]
}
EOF
#重启镜像
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker常用命令
帮助命令
docker version
docker info # docker更加详细的信息
docker 命令 --help # 帮助命令
帮助文档地址:https://docs.docker.com/reference/
镜像命令
docker images
docker images#官方文档查看
docker images --help
[root@iz2ze9n36uysr6g8wtg6nsz /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 10 months ago 13.3kB
# 解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID
CREATED
SIZE
#可选项
-a, --all Show all images (default hides intermediate images)
-q, --quiet Only show numeric IDs
docker images -aq
docker search
#docker hub进行网页搜索
# 用命令
[root@iz2ze9n36uysr6g8wtg6nsz /]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10121 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3716 [OK]
#可选项
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output
docker search mysql --filter=STARS=3000
docker pull下载镜像
docker pull mysql #下载最新版
[root@iz2ze9n36uysr6g8wtg6nsz /]# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
bb79b6b2107f: Pull complete #分层下载 docker images的核心 联合文件系统
49e22f6fb9f7: Pull complete
842b1255668c: Pull complete
9f48d1f43000: Pull complete
c693f0615bce: Pull complete
8a621b9dbed2: Pull complete
0807d32aef13: Pull complete
a56aca0feb17: Pull complete
de9d45fd0f07: Pull complete
1d68a49161cc: Pull complete
d16d318b774e: Pull complete
49e112c55976: Pull complete
Digest: sha256:8c17271df53ee3b843d6e16d46cff13f22c9c04d6982eb15a9a47bd5c9ac7e2d
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #从什么地方下载
#可选信息
-a, --all-tags Download all tagged images in the repository
--disable-content-trust Skip image verification (default true)
--platform string Set platform if server is multi-platform capable
-q, --quiet Suppress verbose output
#指定版本下载
docker pull mysql:5.7
docker remove 删除
docker rmi -f # remove image f表示全部删除
docker rmi -f id #同过id进行删除
docker rmi -f $(docker images -aq) #删除所有镜像
容器命令
说明:有了镜像才可以创建容器,可以下载一个Linux镜像进行测试
新建容器并启动
docker run [可选参数] image镜像
#可选参数说明
--name="Name" 容器的名字
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口
-p 主机端口:容器端口 8080:8080 (最常使用的方式)
-p 容器端口
容器端口
-P 大P随机指定端口
#测试
# it交互运行 /bin/bash用来指定交互运行的控制台
[root@iz2ze9n36uysr6g8wtg6nsz /]# docker run -it centos /bin/bash
[root@5c499572b015 /]#
exit #退出容器,并且停止容器
#用快捷键 Ctrl+p+Q 退出容器不停止容器
列出所有的容器
#列出当前正在运行的容器
docker ps
#列出运行过的容器
docker ps -a
#显示刚刚运行的容器
docker ps -a -n=1
#显示容器的编号
docker ps -q
删除容器
docker rm -f 容器id #删除指定容器
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
启动和停止容器的操作
docker start 容器id
docker restart 容器id
docker stop 容器id
docker kill 容器id #强制停止当前的容器
常用的其他命令
后台启动容器(启动守候式容器)
docker run -d centos(centos是镜像名)
#问题,发现centos停止了,容器使用后台运行,必须要有一个前台进程,否则就会自动停止
查看日志
docker logs -f -t --tail 10 容器ID # 10表示显示的条数,
# -t 是加入时间戳
# -f 跟随最新的日志打印
# --tail 数字 显示最后多少条
#测试
docker run -d centos /bin/sh -c "while true;do echo hello zzyy;sleep 2;done"
docker logs -f -t --tail 10 容器ID
查看容器中进程的信息
docker top 容器id
#测试
docker top 12783f1da8fd
[root@iz2ze9n36uysr6g8wtg6nsz ~]# docker top 12783f1da8fd
UID PID PPID C STIME TTY TIME CMD
root 2468 2430 0 14:47 ? 00:00:00 /bin/sh -c while true;do echo hello zzyy;sleep 2;done
查看容器内部信息
docker inspect 容器id
[
{
"Id": "12783f1da8fdc2d3755ce2478010e76bb728ad543ed99621160d353e9acfd43d",
"Created": "2020-11-01T06:47:30.165841097Z",
"Path": "/bin/sh",
"Args": [
"-c",
"while true;do echo hello zzyy;sleep 2;done"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 2468,
"ExitCode": 0,
"Error": "",
"StartedAt": "2020-11-01T06:47:30.503220955Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Mounts": [],
"Config": {
"Hostname": "12783f1da8fd",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/sh",
"-c",
"while true;do echo hello zzyy;sleep 2;done"
],
"Image": "centos",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20200809",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS"
}
},
"NetworkSettings": {
}
}
]
进入正在运行的容器并以命令行交互
#我们经常以后台的方式运行容器 ,这样可以用以下方式进入容器
#1.方式一 是在容器中打开新终端
docker exec -it 容器id bashShell
#测试
docker exec -it 12783f1da8fd /bin/bash
#2.方式二 直接进入容器启动命令的终端,不会启动新的进程
docker attach 容器id
在容器内拷贝文件到主机上
docker cp 容器id:容器内路径 目的主机路径
#测试
#在容器内新建java文件
[root@12783f1da8fd home]# touch chen.java
[root@12783f1da8fd home]# ls
chen.java
#在主机上进行拷贝动作
[root@iz2ze9n36uysr6g8wtg6nsz /]# docker cp 12783f1da8fd:/home/chen.java /home
[root@iz2ze9n36uysr6g8wtg6nsz /]# cd home
[root@iz2ze9n36uysr6g8wtg6nsz home]# ls
admin chen.java
#此处拷贝是一个手动过程,未来可以使用-v卷的技术,可以实现,自动同步
小结
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 # 截取容器停止时的退出状态值
练习部署ngnix/tomcat/es+kibana
部署ngnix
systemctl start docker
#下载
docker pull nginx:版本号
#查看
docker images
#后台运行 暴露端口
docker run -d --name nginx01 -p 3344:80 nginx
#测试
curl localhost:3344
端口暴露
思考问题:我们每次改动nginx配置文件都需要进入容器内部,非常的不方便,如果可以在容器外修改就好了,于是出现了-v数据卷
部署tomcat
#下载镜像
docker pull tomcat
#查看镜像是否下载成功
docker images
#创建tomcat容器并且后台运行tomcat容器 指定端口
docker run -d -p 3355:8080 tomcat
#查看运行的容器
docker ps
#测试
curl localhost:3355
#以命令行的方式进入tomcat
docker exec -it 26d455045262 /bin/bash
#webapps为空外网无法访问
root@26d455045262:/usr/local/tomcat# cd webapps
root@26d455045262:/usr/local/tomcat/webapps# ls
#将webapps。dist下文件全部复制到webapps下
root@26d455045262:/usr/local/tomcat# cp -r webapps.dist/* webapps
#可以成功访问
http://123.57.166.236:3355/
思考问题:我们以后部署项目,如果每次都要进入容器是不是很麻烦,我要是可以在外部提供一个映射到webapps下,我们在外部部署项目,就自动同步到内部就好了
部署es+kibana
#es 暴露的端口很多
#es 十分耗费内存
docker stats#查看内存使用情况
#正常下载执行 1核2G的服务器会卡死 因为es要1g多
#通过修改配置文件 -e 环境配置修改来增加内存限制
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
docker stats e07234c6a3c1
#然后发现内存的使用情况变小了
#测试
crul localhost:9200
[root@iz2ze9n36uysr6g8wtg6nsz ~]# curl localhost:9200
{
"name" : "01a278b2bfc0",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "QX-VdiHURuy7wWwi-ZmNxA",
"version" : {
"number" : "7.6.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
可视化
portainer
docker图形化界面管理工具!提供一个后台的面板供我们操作
docker run -d -p 3366:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
Docker 镜像
commit镜像
docker commit提交容器成为一个新副本
docker commit -m="提交的描述信息" -a="作者" 修改过的容器id 自定义镜像名:[TAG]
容器数据卷
什么是容器数据卷
数据存在容器中,当容器删除之后,容器中的数据也会删除,于是希望有这样一个技术用于解决容器中的数据的持久化,将数据同步在本地,其实是将容器中的数据挂载出来。
使用数据卷
方式一:使用命令来挂载 -v
docker run -it -v 主机目录:容器中的目录 镜像名 终端
# 测试
docker run -it -v /home/ceshi:/home 0d120b6ccaa8 /bin/bash #0d120b6ccaa8 image的id
#查看数据卷是否挂载成功
docker inspect d57099f65bb7 #d57099f65bb7容器id
#测试容器与宿主机(主机)之间的数据共享
查看数据卷是否挂载成功(双向绑定)
测试容器与宿主机(主机)之间的数据共享
停止容器,在主机上的操作依旧能够同步
mysql安装
本地的操作可以同步到远程数据库中
练习:安装mysql
docker pull mysql
docker images
#运行镜像创建容器;挂载需要同步的文件;配置mysql的密码(通过在docker hub上搜索mysql查看它的使用命令 -e);给容器重命名
docker run -d -p 3306:3306 -v /home/mysql/data:/var/lib/mysql -v /home/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=1234 --name mysql01 625b734f984
#发现一个问题如果是镜像选择最新的,无法在本地进行连接,选择5.7就可以
docker run -d -p 3310:3306 -v /home/mysql1/data:/var/lib/mysql -v /home/mysql1/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
#测试本地连接数据库,新建数据库test
#linux中的使用
service mysql start
#或
mysql
#
mysql -u root -p
#
show databases;
#
show tables;
#
use DB
#
create table mytable(keyId int primary key, name char(10));
#
insert mytable(keyId,name) values(1,"chen");
#
select * from mytable;
具名和匿名挂载
# 匿名挂载 不指定主机名路径 —P随机指定端口
docker run -d -P --name nginx01 /etc/nginx nginx
#具名挂载 -v 卷名:容器内路径 相当于给卷起名 无/,不是以 /开头
docker run -d -P --name nginx01 -v juming:/etc/nginx nginx
#查看卷 可以看到卷挂载的路径
docker volume inspect juming
#规定容器的读写权限
docker run -d -P --name nginx01 -v juming:/etc/nginx:ro nginx
docker run -d -P --name nginx01 -v juming:/etc/nginx:rw nginx
#ro 只能通过宿主机来操作,容器内部无法操作
初识Dockerfile
使用构建docker镜像的构建文件,其实是段命令脚本
通过这个脚本可以生成镜像,镜像是一层一层的,脚本的命令是一个一个的,每个命令就是一层
#写一个dockerfile 指 令必须大写
FROM centos
VOLUME ["volume1","volume2"]#挂载 容器内的文件
CMD echo "------end------"
CMD /bin/bash
#创建镜像 -f 那个是文件夹下的dockerfile文件 -t tag 镜像名 .表示在当前文件夹下生成
docker build -f /home/dockerF/dockerfile1 -t cwbImage .
#生成...
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 0d120b6ccaa8
Step 2/4 : VOLUME ["volume1","volume2"]
---> Running in 72798fcc8b59
Removing intermediate container 72798fcc8b59
---> b7f20e0bdd8c
Step 3/4 : CMD echo "------end------"
---> Running in 4e32b45aa8cb
Removing intermediate container 4e32b45aa8cb
---> 477404805b70
Step 4/4 : CMD /bin/bash
---> Running in bf59306e6750
Removing intermediate container bf59306e6750
---> 87e6eda0c235
Successfully built 87e6eda0c235
#查看
[root@iz2ze9n36uysr6g8wtg6nsz dockerF]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
cwbimage latest 87e6eda0c235 4 minutes ago 215MB
#运行镜像
docker run -it cwbimage /bin/bash
这个卷一定和外部的两个文件同步
#在colume1下新建文件test.text
#在对应的主机目录下进行查看,看是否进行同步
因此也可以通过Dockerfile进行挂载
数据卷容器
多个mysql容器之间同步数据
命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器
–volumes-from
删除docker01 dokcer02依然可以访问这个文件 硬链接
DockerFile
用来构建docker镜像,是一个参数脚本
- 编写dockerfile文件
- docker build 构建成为一个镜像
- docker run 运行镜像
- docker push发布镜像(docker hub,阿里云镜像仓库)
FROM #基础信息
MAINTAINER
RUN
ADD
自己构建的centos中添加了vim 和net-tools
CMD和ENTRYPOINT
总结
CMD中的命令会被“docker run 镜像id 命令1” 中的命令1替换,而entrypoint则不会,命令1会追加到其命令之后
部署SpringBoot博客项目
#开启docker
systemctl start docker
#创建mysql容器
docker run -d -p 3306:3306 -v /Blog/mysql/data:/var/lib/mysql -v /Blog/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=1234 --name blogmysql mysql:5.7
#查看
docker ps
#本地测试连接docker中的mysql 并修改项目中jdbc驱动的地址 将localhost改为blogmysql1 用于link
连接成功
#打包springboot package
#编写Dockerfile
FROM java:8
ADD *.jar /blog.jar
VOLUME /tmp
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","./blog.jar"]
#xftp上传jar包和Dockerfile
#在blog文件夹下创建镜像
docker build -f Dockerfile -t myblog:1.0 .
#查看镜像
docker images
#运行镜像创建容器 并且link mysql blogmysql是mysql容器的别名
docker run -p 8080:8080 -e ES_JAVA_OPTS="-Xms1024m -Xmx1024m" --name myblog --link blogmysql:blogmysql1 -d 镜像id
#打印日志
docker logs -f 容器id
#测试
curl localhost:8080/
发布镜像
发布镜像到dockerHUB
#登录dockerhub
docker login -u dockerfish007
#247bf7d9db07是镜像id,dockerfish007是dockerhub登录名,/myblog007:1.1为自定义的镜像名称 然后生成一个dockerfish007/myblog007的image
docker tag 247bf7d9db07 dockerfish007/myblog007:1.1
#push到docker hub
docker push dockerfish007/myblog007:1.1
发布镜像到阿里云
#登录
docker login --username=牛肉爱上米粉 registry.cn-hangzhou.aliyuncs.com
#
docker tag 247bf7d9db07 registry.cn-hangzhou.aliyuncs.com/cwbstudy/blog:0.1
# 测试
docker images
#
docker push registry.cn-hangzhou.aliyuncs.com/cwbstudy/blog:0.1
#使用
docker pull registry.cn-hangzhou.aliyuncs.com/cwbstudy/blog:0.1
安装redis
安装redis
用yml安装
https://hub.daocloud.io/
version: '3.1'
services:
redis:
image: daocloud.io/library/redis:5.0.7-alpine
restart: always
container_name: redis
environment:
- TZ=Asia/Shanghai
ports:
- 6379:6379
#执行命令
docker-compose up -d
#报错没有此命令
解决:
#1.安装pip
yum -y install epel-release
yum -y install python-pip
#升级
pip install --upgrade pip
#2.安装docker-compose
pip install docker-compose
继续报错:
解决:
#
pip uninstall pyrsistent
pip install pyrsistent==0.16.0
继续安装
docker-compose up -d
发现还是有错,错误提示如下:
[root@Cwb docker_redis]# docker-compose up -d
/usr/lib/python2.7/site-packages/paramiko/transport.py:33: CryptographyDeprecationWarning: Python 2 is no longer supported by the Python core team. Support for it is now deprecated in cryptography, and will be removed in a future release.
from cryptography.hazmat.backends import default_backend
ERROR: yaml.scanner.ScannerError: while scanning for the next token
found character '\t' that cannot start any token
in "./docker-compose.yml", line 3, column 1
[root@Cwb docker_redis]#
其实是yaml中不能用tab键,必须用空格
然后下载成功
连接redis 通过redis-cli连接
#b3为容器标识 id前两位
docker exec -it b3 /bin/sh
#连接
redis-cli
下载图形界面在windows中操作redis
GitHub 搜索 redis desktop windows