docker安装应用部署私有仓库搭建命令
Jeff的技术栈 人气:0Docker
入门到精通
ssh root@39.101.184.220 """ 1)docker就是Linux上及其轻量的虚拟机 2)虚拟机是存在宿主系统中,通过镜像给宿主系统拓展子系统的(一个镜像理论上可以做n个子系统) 3)两个特别重要的概念 image:镜像 container:容器(子系统) 4)工作方式: i)在服务器系统下载docker(为服务器安装虚拟机,服务器系统就是宿主系统) ii)用docker去下载对应需求的镜像:镜像操作 iii)通过镜像制造容器(装子系统):容器操作 5)优势 i)超级轻量级,docker安装的容器体积可以按kB度量 ii)集群部署,docker可以通过一个镜像制造出多个一模一样的容器 iii)便捷管理所有镜像与容器(命令行操作) 6)镜像和容器特点 一般一个镜像中只包含一种软件:比如mysql镜像,创建的容器中只有mysql环境;redis镜像,创建的容器中只有redis环境 注:一个镜像中有多个环境的需要自己制作镜像 """ docker-ce : 免费(使用最多) docker-ee :收费
CentOS安装Docker
方法一
设置管理Docker的仓库
""" 1)安装依赖 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 2)安装稳定仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo """
安装Docker Engine-Community
""" 1)安装 >: yum install docker-ce docker-ce-cli containerd.io 2)如果提示您接受 GPG 密钥,请允许 """
方法二
""" # centos7 安装docker 1 安装依赖 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 2 设置yum源为阿里云 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 3 安装 sudo yum install docker-ce -y """ docker 版本:装的最新版 docker -v Docker version 19.03.8, build afacb8b docker -v查看版本,如果是17年之前的,就是老版本,操作习惯不一样
Docker基础命令
开启关闭
""" 1)启动 >: service docker start | systemctl start docker 2)关闭 >: service docker stop | systemctl stop docker 3)重启 >: service docker restart | systemctl restart docker """
查找镜像
# 查找镜像:https://hub.docker.com/ docker search helloworld docker search centos # 拉取镜像 docker pull centos # 拉取最新的:相当于docker pull centos:latest docker pull centos:centos7 # 拉取一个centos7 docker pull centos:centos6.7 docker pull centos:centos10 # 这个 没有,就报错
镜像操作
""" 1)列出镜像 >: docker image ls 2)拉取镜像 >: docker [image] pull 镜像名:版本 eg: docker image pull hello-world:latest # 最后一个版本 3)删除镜像 如果有容器了,可以强制删除镜像。不推荐这么做 >: docker image rm 镜像ID >: docker image rm 镜像名字:镜像版本 # 通过名字删除 docker image rm centos:centos7 4)将容器反向打包镜像 >: docker save -o <文件名.tar> <镜像名> 5)根据打包的镜像文件加载镜像 >: docker load -i <文件名.tar> """
容器操作
""" docker exec --help # 查看参数的含义 1)创建容器 >: docker run [选项参数] 镜像名 [命令] 创建容器命令:docker run -i:表示运行容器 -t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。 --name :为创建的容器命名。容器名字不能重 -v:表示目录映射关系(前者是宿主机目录,后者是容器的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。 -d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。 -p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射 # 演示 #基于哪个镜像跑容器:centos:centos7 如果写成centos表示跑最新的 #如果没有这个镜像呢?去远程拉,拉下来再跑,远程没有就报错 # 1.容器要运行(跑完进入了容器) docker run -it --name=mycentos7 centos:centos7 /bin/bash /bin/bash:进入容器,并开一个终端 bash:进入内层终端 exit: 退出一层 # 2.以守护进程形式跑(跑完没有进入容器) docker run -di --name=mycentos2_2 centos:centos7 2)查看所有容器:-a就是--all代表全部展示 >: docker container ls [-a] >: docker ps [-a] 3) 容器的启动与停止 docker stop 容器id/名字 docker start 容器id/名字 docker restart 容器id/名字 4)kill掉一个已经在运行的容器 >: docker kill 容器id 5)删除容器 停止后才能删除 >: docker rm 容器id 6)进入容器 1.exec(使用最多) 2.attach 3.ssh连接(容器要启动ssh服务22端口没有服务在监听) >: docker exec 参数 容器id bash eg: docker exec -it mycentos7 bash eg: docker exec -it 685e1 bash eg: docker exec mycentos2_2 ls # 在mycentos2_2的容器中执行ls,并打印结果 7)退出容器 >: exit """
文件拷贝
# 文件拷贝 # 从宿主机copy到容器内部 docker cp untitled3.tar mycentos2_2:/home # 从容器内部copy出来 docker cp mycentos2_2:/home/untitled3.tar ./
目录映射(数据卷)
# 映射之后,操作宿主机目录和操作容器目录会相互影响 docker run -di --name=mycentos2_3 -v /root/test:/home centos:centos7 名字 宿主机/root/test映射到容器 /home 版本
查看容器信息
docker inspect 容器名字/容器id # 查看ip地址 docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器id/名字
docker应用部署
# mysql服务 在docker中运行 -e表示环境变量,root密码 docker run -id --name=mysql1 -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 # redis服务 在docker中运行 docker run -id --name=myredis -p 6379:6379 redis # docker中部署django项目 nginx + django +uwsgi
容器打包成镜像
# 把容器打包成镜像 docker run -di --name=mydjango python:3.6 # 安装django环境 pip install django==1.11.9 apt-get update apt-get install vim # 把容器打包成镜像 docker commit 容器名字 镜像名字 docker commit mydjango mydjango_i # 基于镜像再跑起容器 docker run -di --name=mydjango2 mydjango_i # 镜像打成一个tar包,压缩一下(在当前目有个mydjango.tar) docker save -o 压缩包名字.tar mydjango_i # copy这个压缩包到任意的机器上(装了docker) # 把压缩包,恢复成镜像 docker load -i 压缩包名字.tar 容器里装了python3.6 mysql,django, uwsgi ,redis 项目在里面---》镜像--》容器 10个容器 django+uwsgi mysql redis 一个一个起:docker-compose 100台机器,10w容器 k8s
总结
# 容器的操作 查看正在运行的容器:docker ps 查看所有容器:docker ps -a 删除容器:docker rm 容器id/名字 容器id/名字 支持同时删多个 容器启动停止: docker stop/start/restart 容器名字/id 创建并启动容器:docker run -i -d -t --name=名字 -v 目录映射/数据卷 -p 端口映射/网络 镜像名字:tag -镜像如果没有,会自动去拉取,然后启动 查看容器日志:docker logs 容器id/名字 文件拷贝: docker cp 查看容器信息,ip:docker inspect 容器名称(容器ID) 进入容器:docker exec -it 容器id /bin/bash docker exec 容器id ls ssh attach
Docker file编写
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像,用来构建镜像的 # docker pull # 通过容器---》打包成镜像--》压缩--》拿到任何位置 # 通过Dockerfile构建镜像 1、对于开发人员:可以为开发团队提供一个完全一致的开发环境; 2、对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了; 3、对于运维人员:在部署时,可以实现应用的无缝移植。
docker file常用命令
命令 作用 FROM image_name:tag 定义了使用哪个基础镜像启动构建流程 # FROM 镜像名:版本 MAINTAINER user_name 声明镜像的创建者 ENV key value 设置环境变量 (可以写多条) (核心)RUN command 是Dockerfile的核心部分(可以写多条) eg:写要执行的命令(centos上装一个python3.6,原来在linux上装python,如何操作,就用命令一行一行写出来) RUN wget http://www..../python.tar.gz RUN tar -cvf python.tar.gz RUN cd python RUN make && make install RUN pip3 install django==1.11.9 ADD source_dir/file dest_dir/file 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压 COPY source_dir/file dest_dir/file 和ADD相似,但是如果有压缩文件并不能解压 WORKDIR path_dir 设置工作目录(上面操作的命令都是在这个目录,docker exec 进去,就在当前设置的路径下,之前是在根路径下) CMD [命令] 容器一运行,就会执行命令 # ADD和COPY的区别?一个会解压,一个默认不会解压
eg:基于python3.6构建docker file镜像
# 写一个Dockerfile,基于python3.6 搭建运行环境:django,drf,uwsgi # 名字必须交 Dockerfile ,当你构建的时候,会在当前路径下找这个文件,自动构建 vim Dockerfile FROM python:3.6 MAINTAINER lqz ADD ./django_test.tar /home RUN pip install -r /home/django_test/requirement.txt -i http://pypi.doubanio.com/simple CMD ["/bin/bash"] # 基于docker file构建 docker build -t='django1.11.9' # django1.11.9就是构建完之后的镜像名字 构建完之后就有一个django1.11.9的镜像 # 基于该镜像构建容器 docker run -di --name=myproject -p 8080:8080 django1.11.9 # docker logs myproject 查看报错信息
容器部署项目,用 nuginx做负载均衡
# 1 在项目路径下写Dockerfile FROM python:3.6 MAINTAINER lqz ADD ./requirement.txt /home/ RUN pip install -r /home/requirement.txt -i http://pypi.douban.com/simple/ WORKDIR /home/django_test EXPOSE 8080 VOLUME ["/home"] CMD ["uwsgi", "--ini", "/home/django_test/uwsgi.ini"] # 2 在项目路径下写一个uwsgi.ini [uwsgi] #也可以使用http http=0.0.0.0:8080 #配置项目路径,项目的所在目录 chdir=/home/django_test #配置wsgi接口模块文件路径 wsgi-file=django_test/wsgi.py #配置启动的进程数 processes=4 #配置每个进程的线程数 threads=2 #配置启动管理主进程 master=True #配置存放主进程的进程号文件 pidfile=uwsgi.pid # 3 传到git上(我们直接复制过去了) 在服务器从git上拉下来,解压开 # 4 基于docker file构建镜像 docker build -t='django1.11.9' . #5 运行起django+uwsgi的容器 docker run -di --name=mydjango1 -v /home/s13/myproject:/home -p 8080:8080 django1.11.9 docker run -di --name=mydjango2 -v /home/s13/myproject2:/home -p 8088:8080 django1.11.9 # 6 基于ngixn镜像跑起一个容器来,做目录映射(在宿主机,修改nginx的配置文件) # 创建几个文件夹 mkdir -p /home/nginx/conf /home/nginx/html /home/nginx/logs vim /home/nginx/conf/nginx.conf #写入 worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream node { # node名字随便取,下面需要用到 server 101.133.225.166:8080; # 1号服务器 server 101.133.225.166:8088; # 2号服务器 } server { listen 80; server_name localhost; location / { #负载均衡配置 proxy_pass http://node; # 负载均衡,随机分发请求 } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } } docker run --name nginx -id -p 80:80 -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/html:/etc/nginx/html -v /home/nginx/logs:/var/log/nginx nginx #7 访问http://101.133.225.166/, 会打到不通的docker容器内,即便有一个服务停了,也不会影响项目的运行 # 因为你django docker容器做了目录映射---》只需要修改代码,重启容器即可(git pull 即可) # 不停服更新,停一半,更新,启动--在把另一半更新了 # 停服更新
Docker私有仓库搭建
# 镜像获取: docker pull dockerfile构建 拷贝tar文件,load过来 # 公司内部用的镜像,docker hub上没有,私服(私有服务器) # 操作步骤 # 1 拉一个registry镜像 (本质是个什么?web服务(想像成 web项目在里面)) docker pull registry # 2 跑起容器来 docker run -di --name=registry -p 5000:5000 registry # 3 浏览器输入地址(目前是空的) http://宿主机:5000/v2/_catalog # 4 vi /etc/docker/daemon.json (文件如果没有就创建出来),以后docker pull 先从自己配置的这个拉,再去远程拉 {"insecure-registries":["10.0.0.200:5000"]} # 宿主机地址 # 5 重启docker 服务 systemctl restart docker # 6 启动容器 docker restart registry # 7 标记本地的镜像(可能是dockerfile构建的,也可能是通过容器打包成的) docker tag django1.11.9 101.133.225.166:5000/django1.11.9 # docker tag redis 101.133.225.166:5000/myredis # 8 把标记好的本地镜像,传到私服 docker push 101.133.225.166:5000/django1.11.9 #docker push 101.133.225.166:5000/myredis # 9 再访问这个地址http://宿主机:5000/v2/_catalog 就能看到你上次的镜像再里面了 # 10 只要在etc/docker/daemon.json,配置了这个{"insecure-registries":["101.133.225.166:5000"]} 的所有小伙伴,都可以拉取我上传的镜像 docker pull 101.133.225.166:5000/myredis # 公司可能没有私服,直接通过dockerfile构建 # 大一点的公司,搭建私有仓库,里面放了一些镜像(不让你去docker hub下了,直接只从私有仓库下载)
Docker安装Mysql
""" 1)安装 >: docker image pull mysql:5.7 >: 如果报错m1安装:docker pull --platform linux/x86_64 mysql 2)创建容器:root根用户的密码MYSQL_ROOT_PASSWORD采用的是root >: docker container run -itd -p3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7 docker run -id --name=mysql3308 -p3308:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 注:本地测试 >: mysql -hIP -P端口 -uroot -p密码 >: mysql -h 39.99.192.127 -P 3306 -u root -p >: root >: create database luffy default charset=utf8; >: grant all privileges on luffy.* to 'luffy'@'%' identified by 'Luffy123?'; >: grant all privileges on luffy.* to 'luffy'@'localhost' identified by 'Luffy123?'; >: flush privileges; """
docker内部mysql允许外部访问
M1拉镜像:docker pull --platform linux/x86_64 mysql 先进入到mysql容器内部,并登陆mysql -uroot -p use mysql; update user set authentication_string = password('123456') where user = 'root'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' IDENTIFIED BY '123456' WITH GRANT OPTION; 用户名:root 密码:123456
Docker安装Redis
""" 1)下载镜像 >: docker pull redis:4.0.9 2)创建容器 >: docker container run -itd -p6379:6379 redis:4.0.9 ## : -p宿主端口(服务器):容器端口(通过镜像安装的) 3)进入容器 >: docker container exec -it <容器名称/容器ID> bash eg: docker exec -it 685e1 bash 4)测试 >: redis-cli >: redis-cli -h 39.99.192.127 -p 6379 >: config set requirepass Admin123 """
加载全部内容