容器操作, 网络和数据卷,应用部署, 备份迁移,dockerfile,私有仓库

云原生容器应用程序设计七个原则:

# 1 docker概念:
	-版本(17.x以上,都是新版本),docker ce 和docker ee
	-轻量级,环境问题(开发一套环境,运维一套环境)
  -镜像和容器:镜像是一系列文件:redis镜像(linux系统+redis软件)  容器:当成操作系统
  -隔离:容器里部署我的项目
  -宿主机:运行docker软件的机器
  -c/s架构:通过resful交互
  
# 2 镜像操作
	-搜索镜像:docker search 镜像名字 
  -下载镜像:docker pull 镜像名字:tag   # 如果不跟,默认下载最新的(******)
  -查看本地镜像:docker images   #(****)
  -删除本地镜像:docker rmi 镜像id/镜像名字
  	docker rmi 4453 778 333 
    
# 3 容器操作
	-docker ps  # 查看正在运行的容器
  -docker ps -a # 查看所有容器(运行和停止)
  -状态:创建,运行,停止,暂停
  -启动和停止:dokcer stop 容器id/容器名字   
  -docker start 容器id/容器名字
  

1 容器操作

# 1 容器创建
# 创建一个容器,执行的第一条命令是/bin/bash
docker create -it --name=mycentos1 centos:7 /bin/bash  # 夯住,相当于进入了一个窗口
# 如果后面跟的命令是一个能夯住的命令,容器在启动的时候,会一直运行,否则,容器一启动就停止
docker create -i --name=mycentos2 centos:7 ps -a  # 一启动就停止
ps -a : 就是一个普通的查看进程的命令
/bin/bash:

-i:表示运行容器
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
--name :为创建的容器命名。
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。


-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
# 2 容器运行
docker start 容器id/容器名字
# 3 创建并运行
docker run -di --name=mypython  python:3.6 # 创建并运行(后台运行)
  
docker run -idt --name=mypython  python:3.6 # 创建并运行(前台运行,相当于在容器内部)
docker run -it --name=mypython  python:3.6  # 进入容器内部,直接运行了Python,相当于一个真实的Python环境。
-在容器内部,  python  -t相当于:/bin/bash

# 5 进入容器内部操作
docker exec 85768eb78045 ps -a  # 在容器上执行ps -a
docker exec -it 85768eb78045 /bin/bash  # 当做进入到容器
# Python容器
docker exec -it mypython python

# 以后,进入容器(相当于)
docker exec -it mypython /bin/bash

# attach:连到第一个进程上
docker attach 11f702f88de6

# ssh连接(容器安装ssh服务)

# 4 容器删除
docker rm 容器id/容器名字



##### 总结:
docker run:创建并运行         
docker exec:容器执行命令(通常用来:进入容器) docker exec -it 容器id/容器名字 /bin/bash


# 5 文件拷贝
# 从宿主机copy文件到容器
docker cp 1.txt centos7:/home  # 把当前路径下的1.txt拷贝到容器的/home路径下
# 从容器copy文件到宿主机
docker cp centos7:/home/1.txt 1.txt  # 把容器home路径下的1.txt拷贝到当前路径下

将宿主机的1.txt文件拷贝mycentos1容器:

将mycentos1容器内部的1.txt拷贝当前宿主机:

2 网络和数据卷

# 1 目录挂载(数据卷): 把宿主机的目录映射到容器  宿主机test文件夹映射到容器内部,这样只要在这个文件夹(宿主机和容器内部)进行的增删改查(文件和文件夹),宿主机和容器联动。
docker run -di --name=mycentos -v /root/test:/home centos:7  # -v表示做一个目录的映射
# 之后,进入容器/home 路径查看有test这个文件夹
docker exec -it mycentos /bin/bash
cd /home
ls

# 2 端口映射(网络)
docker run -di --name=myredis -p 6378:6379 redis
  
# 都可以跟多个

# 查看容器信息

docker inspect 容器名称(容器ID) 
# 过滤,直接查询容器信息的IP地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql

端口映射,向redis内部插值。

本地redis连接云服务器6378端口

如果连接不上,查看云服务的防火墙是否关闭:

systemctl status firewalld
# 如果是active状态,执行如下命令关闭:
systemctl status firewalld

然后,不要忘记如服务器设置的安全组,一定要将这个端口开设出来,不然此端口没暴露,访问不到。

容器状态转换

3 应用部署

# docker中部署服务(redis,mysql,nginx)
# 安装mysql
# 1 拉一个镜像
docker pull mysql:5.7
# 2 运行起容器来
docker run -di --name=mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# -p 代表端口映射,格式为  指主机映射端口:容器运行端口
# -e代表添加环境变量  MYSQL_ROOT_PASSWORD是root用户的登录密码

# 3 远程登录mysql,连接宿主机的IP,指定端口为33306
docker exec -it mysql /bin/bash
mysql -uroot -p

# 3.进入容器内部,启动mysql客户端

远程运行mysql容器:

Navicat连接云服务运行的mysql:

本地建表并插入数据:

4 备份迁移

# 容器打包为镜像
#            容器名字   镜像名字
docker commit centos7 my_image_centos7
# 把镜像打包成一个压缩文件
#把my_image_centos7镜像压缩到centos_my.tar中
docker  save -o centos_my.tar my_image_centos7
# 把压缩文件恢复成镜像
docker load -i centos_my.tar

1585757269277

5 dockerfile

常用命令

FROM image_name:tag  # 定义了使用哪个基础镜像启动构建流程在文件开头必须是一个FROM指令,接下来的指令便在这个父级镜像的环境中运行,直到遇到下一个FROM指令。通过添加多个FROM命令,可以在同一个Dockerefile文件中创建多个镜像。
    
MAINTAINER user_name  # 声明创建的镜像的作者信息。用户名、邮箱。非必须。

ENV key value  # 设置环境变量(可以写多条)
RUN command  # 是Dockerfile的核心部分(可以写多条),用来修改镜像的命令,常用来安装库、程序以及配置程序。一条RUN指令执行完毕后,会在当前镜像上创建一个新的镜像层,接下来对的指令会在新的镜像上继续执行。RUN 语句有两种形式:

    RUN yum update:是在/bin/sh环境中执行的指令的命令
    RUN ["yum", "update"]:直接使用系统调用exec来执行行。
    RUN yum update && yum install nginx:使用&&符号将多条命令连接在同一条RUN语句中。
EXPOSE  # 用来指明容器内进程对外开放的端口,多个端口之间使用空格隔开。运行容器时,通过参数-P(大写)即可将EXPOSE里所指定的端口映射到主机上另外的随机端口,其他容器或主机就可以通过映射后的端口与此容器通信。同时,我们也可以通过-p(小写)参数将Dockerfile中EXPOSE中没有列出的端口设置成公开的。    
ADD source_dir/file dest_dir/file  # 将宿主机的文件(也可以是一个网络文件,也可以是一个文件夹)添加到容器内,如果是一个压缩文件,将会在复制后自动解压。
	1.第一个参数:源文件(夹)。如果是相对路径,它必须是相对于Dockerfile所在目录的相对路径。如果是URL,会先下载下来,再添加到镜像里去。
    2.第二个参数:目标路径。如果源文件是主机上zip或者tar形式的压缩文件,Docker会先解压缩,然后将文件添加到镜像的指定位置。如果源文件是一个通过URL指定的网络压缩文件,则不会解压。

COPY source_dir/file dest_dir /file  # 和ADD相似,但是如果有压缩文件并不能解压
    
VOLUME  # 在镜像里创建一个指定路径(文件或文件夹)的挂载点,这个容器可以来自主机或者其它容器。多个容器可以通过同一个挂载点共享数据,即便其中一个容器已经停止,挂载点也仍热可以访问。

ENV  # 设置容器运行的环境变量。在运行容器的时候,通过-e参数可以修改这个环境变量值,也可以添加新的环境变量:
	docker run -e WEBAPP_PORT=8000 -e WEBAPP_HOST=www.example.com ...

CMD  # 用来设置启动容器时默认运行的命令。

ENTRYPOINT  # 与CMD类似,也是用来指定容器启动时的默认运行的命令。区别在于:运行容器时添加在镜像之后的参数,对ENTRYPOINT是拼接,CMD是覆盖。
    ENTRYPOINT [ "ls", "-l"]
    docker run centos ==> docker run centos ls -l
    docker run centos -a ==> docker run centos ls -l -a
    我们在运行容器的时候可以通过--entrypoint来覆盖Dockerfile中的指定:docker run 		     gutianlangyu/test --entrypoint echo "hello world"

USER  # 为容器的运行及接下来RUN、CMD、ENTRYPOINT等指令的运行指定用户或UID。
    
WORKDIR path_dir  #  为接下来执行的指令指定一个新的工作目录,这个目录可以是绝对目录,也可以是相对目录。根据需要,WORKDIR可以被多次指定。当启动一个容器时,最后一条WORKDIR指令所指的目录将作为容器运行的当前工作目录。

ONBUILD  #  触发器指令。构建镜像时,Docker的镜像构建器会将所有的ONBUILD指令指定的命令保存到镜像的元数据中,这些命令在当前镜像的构建过程中并不会执行。只有新的镜像使用FROM指令指定父镜像为这个镜像时,便会触发执行。

    使用FROM以这个Dockerfile构建出的镜像为父镜像,构建子镜像时:
    	ONBUILD ADD . /app/src:自动执行ADD . /app/src

# Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像

# 依赖镜像名称和ID
FROM python:3.6
# 指定镜像创建者信息
MAINTAINER zhang
RUN pip install django==1.11.9  -i https://pypi.doubanio.com/simple
RUN mkdir /home/zhang
WORKDIR /home
docker build -t='django_img' .   # 构建出django_img 镜像  .表示根据当前路径下的Dockerfile构建出一个django_img的镜像,如果本地没有FROM指定的Python版本镜像,会先去拉,构建出一个基础镜像来


基于centos7 源码安装python环境,安装ajango 1.11.9 用dockerfile构建

方式一:直接在dockerfile文件中编写RUN语句,从网上下载python压缩包。

FROM centos:7.6
ENV PATH $PATH:/usr/local/python3/bin/
ENV PYTHONIOENCODING utf-8
WORKDIR /server
COPY . /server
RUN set -ex \
	&& yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make wget \
	&& yum clean all \
	&& mkdir /usr/local/python3 \
	&& wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tar.xz \
	&& tar -xvJf  Python-3.6.8.tar.xz && rm -f Python-3.6.8.tar.xz \
	&& cd Python-3.6.8 \
	&& ./configure prefix=/usr/local/python3 \
	&& make && make install \
	&& ln -s /usr/local/python3/bin/python3.6 /usr/local/bin/python3 \
	&& ln -s /usr/local/python3/bin/pip3 /usr/local/bin/pip3 \
	&& cd .. \
	&& rm -rf Python-3.6.8
CMD ["usr","bin","bash"]

方式二:python源在国外,直接在dockerfile中用wget下载pythond的tar包,可能会很慢,我们可以自己现将python的tar包下载到本地,然后将python的tar包放在dockerfile的同级目录。

FROM centos:7.6
ENV PATH $PATH:/usr/local/python3/bin/
ENV PYTHONIOENCODING utf-8
WORKDIR /server
COPY . /server
RUN set -ex \
	&& yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make wget \
	&& yum clean all \
	&& mkdir /usr/local/python3 \
	&& wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tar.xz \
	&& tar -xvJf  Python-3.6.8.tar.xz && rm -f Python-3.6.8.tar.xz \
	&& cd Python-3.6.8 \
	&& ./configure prefix=/usr/local/python3 \
	&& make && make install \
	&& ln -s /usr/local/python3/bin/python3.6 /usr/local/bin/python3 \
	&& ln -s /usr/local/python3/bin/pip3 /usr/local/bin/pip3 \
	&& cd .. \
	&& rm -rf Python-3.6.8
CMD ["usr","bin","bash"]

6 私有仓库

# 公司自己的镜像,放到私有仓库(公司内部,张三,李四,都可以使用私有仓库的镜像)
# 私有仓库本质就是一个web项目(linux+registry(用其他语言写的一个web服务))

# 1 docker pull registry   拉取registry镜像
# 2 docker run -di --name=registry -p 5000:5000 registry  运行容器  # 加--volume选项,可将registry容器内的镜像仓库挂载到本地,方便查看,如图1。
# 3 浏览器访问:http://175.24.103.108:5000/v2/_catalog  返回空{"repositories":[]}表示私有仓库搭建成功
#修改daemon.json
vi /etc/docker/daemon.json

"insecure-registries":["175.24.103.108:5000"]
  
# 4 重启docker 服务(所有容器都是停止状态)
systemctl restart docker

# 5 启动registry容器
docker start registry

# 6 标记镜像
docker tag django_img 39.98.199.71:5000/django_img

# 7 上传镜像(私有仓库)
docker push 39.98.199.71:5000/django_img
  
#8  再从浏览器访问http://175.24.103.108:5000/v2/_catalog  或命令行 curl http://175.24.103.108:5000/v2/_catalog 
能看到刚刚上传的镜像

查看镜像版本:curl curl http://175.24.103.108:5000/v2/django_img/tags/list  # 如下图5

# 9 从私有仓库上拉刚刚上传的镜像
docker pull 39.98.199.71:5000/django_img

# 以后只要同时配置了daemon.json,再拉取镜像,优先从私有仓库拉,没有在去国外

上述步骤3除了创建daemon.json文件添加insure-registries参数外,也可以编辑systemd文件,如下图4;其实这种配置和daemon.json一个意思,在启动docker服务时都会读取insecure-registries参数。
然后查看配置在docker.service的insecure-registries是否生效:systemctl status docker.service -l  # 如下图6

图1:

图2:

图3:

图4:

图5:

图6:

docker run --restart  # 查看docker重启策略
  always #不论什么情况下都重启
  no #不重启
  no-failure # 失败的时候重启,默认是3次
  on-failure: # 失败的时候重启,默认是3次;但是可以指定重启的次数
  unless-stopped  # 停止无效(一直开着)

posted on 2020-04-01 00:41  jueyuanfengsheng  阅读(232)  评论(0编辑  收藏  举报