docker 学习笔记
阿里云Docker Registry registry.cn-chengdu.aliyuncs.com/xiafeng/docker
$ sudo docker login --username=wind_627@163.com registry.cn-chengdu.aliyuncs.com
示例 使用"docker tag"命令重命名镜像,并将它通过专有网络地址推送至Registry。
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
registry.aliyuncs.com/acs/agent 0.7-dfb6816 37bb9c63c8b2 7 days ago 37.89 MB
$ sudo docker tag 37bb9c63c8b2 registry-vpc.cn-chengdu.aliyuncs.com/acs/agent:0.7-dfb6816
使用 "docker push" 命令将该镜像推送至远程。
$ sudo docker push registry-vpc.cn-chengdu.aliyuncs.com/acs/agent:0.7-dfb6816
常用命令
clear 清
cat 查看文件
touch 创建文件
curl 访问地址
localhost
shutdown -h now
uname -r
配置镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://e7m5fxhx.mirror.aliyuncs.com",
"https://hub-mirror.c.163.com/",
"https://reg-mirror.qiniu.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://e7m5fxhx.mirror.aliyuncs.com",
"https://hub-mirror.c.163.com/",
"https://reg-mirror.qiniu.com"]
}
2.需要的安装包
yum install -y yum-utils
3.设置镜像的仓库
yum-config-manager \ --add-repo \https://download.docker.com/linux/centos/docker-ce.repo
默认是从国外的,不推荐
推荐使用国内的
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新yum软件包索引
yum makecache fast
4.安装docker相关的 docker-ce 社区版 而ee是企业版
yum install docker-ce docker-ce-cli containerd.io
6. 使用docker version查看是否按照成功
systemctl enable docker 开机自启动
systemctl start docker 启动
sudo systemctl restart docker 重启docker
docker images 查看一下下载的镜像
docker run hello-world 测试
/var/lib/docker 是docker的默认工作路径!
1.帮助命令
docker version #显示docker的版本信息。
docker info #显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help #帮助命令
帮助文档的地址:https://docs.docker.com/engine/reference/commandline/build/
2.镜像命令
docker images #查看所有本地主机上的镜像 可以使用docker image ls代替
docker search 搜索镜像
docker pull 下载镜像 docker image pull
docker rmi -f 镜像id #删除指定的镜像
docker rmi -f 镜像id 镜像id 镜像id 镜像id#删除指定的镜像
docker rmi -f $(docker images -aq) #删除全部的镜像
docker rmi -f $(docker images -aq) 全部
3.容器命令
docker run 镜像id 新建容器并启动
docker ps 列出所有运行的容器 docker container list
docker rm 容器id 删除指定容器
docker start 容器id #启动容器
docker restart容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
docker run [可选参数] image | docker container run [可选参数] image
参书说明
--name="Name" 容器名字 tomcat01 tomcat02 用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080(宿主机):8080(容器)
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
-P(大写) 随机指定端口
测试、启动并进入容器
docker run -it centos /bin/bash
exit #容器直接退出
ctrl +P +Q #容器不停止退出
删除容器
docker rm 容器id #删除指定的容器,不能删除正在运行的容器,如果要强制删除 rm -rf
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
查看镜像的元数据
命令
docker inspect 容器id
查看容器中进程信息 ps
docker top 容器id
入当前正在运行的容器
我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置
命令
docker exec -it 容器id /bin/bash
方式二
docker attach 容器id
从容器内拷贝到主机上
docker cp 容器id:容器内路径 主机目的路径
进入docker容器内部
~ docker exec -it 55321bcae33d /bin/bash
[root@55321bcae33d /]# ls
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
新建一个文件
[root@55321bcae33d /]# echo "hello" > java.java
[root@55321bcae33d /]# cat java.java
hello
[root@55321bcae33d /]# exit
exit
~ docker cp 55321bcae33d:/java.java / #拷贝
~ cd /
/ ls #可以看见java.java存在
Docker 安装Nginx
1. 搜索镜像 search 建议大家去docker搜索,可以看到帮助文档
2. 拉取镜像 pull
3. 运行测试
-d 后台运行
--name 给容器命名
-p 宿主机端口:容器内部端口
docker run -d --name nginx01 -p 8080:80 nginx
curl localhost:3344 #测试
docker 来装一个tomcat
官方的使用
docker run -it --rm tomcat:9.0
之前的启动都是后台,停止了容器,容器还是可以查到
docker run -it --rm image 一般是用来测试,用完就删除(暂时不建议)
--rm Automatically remove the container when it exits
下载
docker pull tomcat
启动运行
docker run -d -p 8080:8080 --name tomcat01 tomcat
测试访问有没有问题
curl localhost:8080
进入容器
~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
db09851cf82e tomcat "catalina.sh run" 28 seconds ago Up 27 seconds 0.0.0.0:8080->8080/tcp tomcat01
~ docker exec -it db09851cf82e /bin/bash
root@db09851cf82e:/usr/local/tomcat#
发现问题:1、linux命令少了。 2.没有webapps
阿里云镜像(阉割版),它为保证最小镜像,将不必要的都剔除了→保证最小可运行环境!
Docker可视化portainer
运行如下命令即可 打开可视化服务
docker run -d -p 8080:9000
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
使用数据卷
方式一 :直接使用命令挂载 -v
docker run -it -v 主机目录:容器内目录 -p 主机端口:容器内端口
~ docker run -it -v /home/ceshi:/home centos /bin/bash
通过 docker inspect 容器id 查看
实战:安装MySQL
获取mysql镜像
~ docker pull mysql:5.7
运行容器,需要做数据挂载 #安装启动mysql,需要配置密码的,这是要注意点!
参考官网hub
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
启动我们得
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
-- name 容器名字
~ docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=windxf --name mysql01 mysql:5.7
启动成功之后,我们在本地使用sqlyog来测试一下
sqlyog-连接到服务器的3306--和容器内的3306映射
在本地测试创建一个数据库,查看一下我们映射的路径是否ok!
具名和匿名挂载
-v 容器内路径!
docker run -d -P --name nginx01 -v /etc/nginx nginx
查看所有的volume的情况
~ docker volume ls
DRIVER VOLUME NAME
local 33ae588fae6d34f511a769948f0d3d123c9d45c442ac7728cb85599c2657e50d
local
这里发现,这种就是匿名挂载,我们在 -v只写了容器内的路径,没有写容器外的路劲!
- ####### 具名挂载 ###########
- docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
- docker volume ls
DRIVER VOLUME NAME
local juming-nginx
通过 -v 卷名:容器内路径
查看一下这个卷
docker volume inspect
所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxxx/_data下
三种挂载: 匿名挂载、具名挂载、指定路径挂载
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载 docker volume ls 是查看不到的
拓展:
通过 -v 容器内路径: ro rw 改变读写权限
ro #readonly 只读
rw #readwrite 可读可写
docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginx
docker run -d -P --name nginx05 -v juming:/etc/nginx:rw nginx
ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!
创建一个自己的centos
1.编写Dockerfile文件
vim mydockerfile-centos
FROM centos
VOLUME ["volume01","volume02"] #创建数据卷01.02
CMD echo "-----end----"
CMD /bin/bash
FROM centos
MAINTAINER cheng1204598429@qq.com
ENV MYPATH /usr/local #设置环境变量
WORKDIR $MYPATH #设置工作目录
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80 #设置暴露的端口
CMD echo $MYPATH
CMD echo "-----end----"
CMD /bin/bash
2、通过这个文件构建镜像
命令 docker build -f 文件路径 -t 镜像名:[tag] .
docker build -f /home/testcentos/dockerfile1 -t windcentos:1.0 .
!!!!!同步数据卷
《docker run -it --name docker01 windcentos:1.0》
《docker run -it --name docker02 --volumes-from docker01 windcentos:1.0 》
文件的本地/var/lib/docker/volumes下
docker build -f mydockerfile-centos -t mycentos:0.1 .
测试运行
docker run -it 9e104981433f /bin/bash
"Name": "572b5ea38896d8a4c8f163e1e5529f926df0776ee266623eabecebb55c1ce7dc",
"Source": "/var/lib/docker/volumes/572b5ea38896d8a4c8f163e1e5529f926df0776ee266623eabecebb55c1ce7dc/_data",
"Destination": "volume01",
多个mysql实现数据共享
docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
这个时候,可以实现两个容器数据同步!
DockerFile构建过程
DockerFile常用指令
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的, 姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤,tomcat镜像,这个tomcat压缩包!添加内容 添加同目录
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 保留端口配置
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承 DockerFile 这个时候就会运行ONBUILD的指令,触发指令。
COPY # 类似ADD,将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量!
编写Dockerfile文件
mkdir Dockerfile
vim mycentos
1 FROM centos
2 MAINTAINER wind<123.qq.com>
3
4 ENV MYPATH /usr/local
5 WORKDIR $MYPATH
6
7 RUN yum -y install vim
8 RUN yum -y install net-tools
9
10 EXPOSE 80
11
12 CMD echo $MYPAIH
13 CMD echo "----end----"
14 CMD /bim/bash
docker build -f mycentos -t mycentos:0.1 .
docker run -it mycentos:0.1
我们可以列出本地进行的变更历史 看看别人怎么配置的。
docker history 2836a03e922f
八、Docker 网络
1.理解Docker 0
ip addr 查看网络
1、我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要按照了docker,就会有一个docker0桥接模式,使用的技术是veth-pair技术!
https://www.cnblogs.com/bakari/p/10613710.html
再次测试ip add
我们发现这个容器带来网卡,都是一对对的
veth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连
正因为有这个特性 veth-pair 充当一个桥梁,连接各种虚拟网络设备的
OpenStac,Docker容器之间的连接,OVS的连接,都是使用veth-pair技术
结论:tomcat01和tomcat02公用一个路由器,docker0。
所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用ip。
3.自定义网络
docker network
connect -- Connect a container to a network
create -- Creates a new network with a name specified by the
disconnect -- Disconnects a container from a network
inspect -- Displays detailed information on a network
ls -- Lists all the networks created by the user
prune -- Remove all unused networks
rm -- Deletes one or more networks
docker network ls
bridge :桥接 docker(默认,自己创建也是用bridge模式)
none :不配置网络,一般不用
host :和所主机共享网络
container :容器网络连通(用得少!局限很大)
5实战:部署Redis集群