一、要点解析
1. 镜像与容器
-
镜像:镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变
-
容器的实质是进程,容器进程运行属于自己的独立和命名空间。容器可以拥有自己的root文件系统、自己的网络配置、自己的进程空间,甚至自己的用户ID空间。
-
二者区别:镜像和容器的关系,就如面向对象程序设计中的类和实例一样。镜像是静态的定义,容器是镜像运行时的实体。
注:docker最佳实践要求,容器不应该向其存储层写入任何数据,容器存储层要保持无状态化。当所有的文件进行写入操作,都应该使用数据卷,或者绑定宿主目录;读写时跳过容器存储层,直接对宿主进行读写
2. 镜像相关命令
-
获取镜像:
docker pull 名称
-
查看主机已有镜像:
docker images
-
搜索远端仓库镜像:
docker search
-
删除镜像:
docker rmi ID
-
创建镜像:
docker commit [options]
;参数说明:-a,作者信息
,-m,提交信息
,-p,提交时暂停容器运行
-
上传镜像:
docker push
3. 容器相关命令
-
查看本机存在的所有容器:
docker ps -a
-
查看运行容器:
docker ps
-
停止容器:
docker container stop ID
-
删除容器:
docker container rm ID
-
新建容器
-
命令:
docker create 容器
-
注意:新建容器处于停止状态。可以使用命令
docker start
进行启动
-
-
新建容器并启动
-
启动容器方式有两种,第一基于镜像新建容器并启动,第二将终止状态容器重新启动。
-
命令:
docker run
-
-
利用
docker run
新建容器并启动容器,docker在后台运行-
检查本地是否存在指定的镜像,不存在就从共有仓库下载
-
利用镜像创建并启动一个容器
-
分配一个文件系统,并在只读的镜像层外面挂载一层可读可写
-
从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
-
从地址池配置一个IP地址给容器
-
执行用户指定的应用程序
-
执行完毕后容器被终止
-
-
进入容器
-
命令:
docker run -t -i 镜像 /bin/bash
-
命令:
docker exec -t -i 镜像 /bin/bash
-
两者的区别在于,前者直接拉去镜像,并运行容器,进入容器内;后者,主要是在运行容器的基础上进去
-
-
退出容器
-
用户可以通过按
Ctrl+d
或输入exit命令来退出容器。注意:在退出容器之后,容器将会自动关闭 -
在不终止容器的情况下退出容器
Ctrl+q
-
-
终止容器
- 命令:
docker stop
- 命令:
-
删除容器
-
命令:
docker rm
-
参数说明:
-f 强行终止并删除一个运行中的容器
-l 删除容器连接,但保留容器
-v 删除容器挂载的数据卷
-
-
导入导出容器
- 导入导出用的较少,将已有容器重新打包成镜像上传仓库
4.实战(创建个人开发部署干净环境)
目的:利用docker 搭建一个干净的ubuntu环境,部署自己运维项目,在自己服务器过期一键迁移。
-
思想: 创建ubuntu系统部署nginx、django项目,相关数据库连接等,连接一个docker搭建mysql环境。
-
查看容器镜像详细信息:
docker inspect id
-
创建环境并进入:
docker run -it -p 8000:80 --name myubuntu -v /opt/myubuntu:/opt/myubuntu ubuntu /bin/bash
-v 后面的映射关系是 “宿主机文件/目录:容器里对应的文件/目录”,其中,宿主机上的文件/目录是要提前存在的,容器里对应的文件/目录会自动创建。
-
退出容器并使容器处于运行状态:
Ctrl+p+q
-
查看运行容器:
docker ps
-
进入容器(在运行容器的基础内进入):
docker exec -it myubuntu /bin/bash
-
更新容器内的软件包(第一次使用系统):
apt-get update
-
安装相应软件(第一次使用系统):
apt-get install vim
-
安装相应软件(第一次使用系统):
apt-get install apt-get install net-tools
创建ssh服务
-
安装ssh服务:
apt-get install openssh-server
-
安装ssh客户端:
apt-get install openssh-client
-
开启ssh服务:
/etc/init.d/ssh start
-
修改配置文件:
vim /etc/ssh/sshd_config
,在# Logging
下添加PermitRootLogin yes
-
重启服务:
service ssh restart
-
设置密码:
passwd root
-
docker 将ssh端口映射出去
-
查看正在运行容器:
docker ps
-
停止容器:
docker stop 4ca
-
将此容器打包成新的镜像:
docker commit 4ca myubuntu-v1.01
-
删除该容器:
docker rm 4ca
-
运行新创建新容器:
docker run -it -p 8000:80 -p 111:22 --name myubuntu -v /opt/myubuntu:/opt/myubuntu myubuntu-v1.01 /bin/bash
-
安装nginx
-
安装nginx:
apt-get install nginx
-
检查nginx语放:
./nginx -t
-
启动nginx:
./nginx
-
修改端口转发:
location /blog { proxy_set_header Host $host:80; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://172.17.0.1:80/; }
-
nginx重启:
./nginx -s reload
-
停止nginx:
nginx -s stop
Django 部署
因为,我们部署环境是在docker 里,纯净的ubuntu中没有相应的pythn环境,所以我们必须安装相应的python软件。
-
安装python2:
apt-get python
-
安装pip:
apt-get install python-pip
-
安装python3:
apt-get python3
-
安装pip3:
apt-get install python3-pip
-
安装虚拟环境:
pip3 install virtualenv
-
创建虚拟环境(使用 --python=python3 来指定克隆 Python3 的环境):
virtualenv --python=python3 env
-
进入虚拟环境:
source env/bin/activate
-
进入项目目录:
cd hq_blog
-
导入依赖环境:
pip install -r requirements.txt
-
补充说明:在导入(安装)依赖,个人已经出现过三次数据库安装(mysqlclient)失败,以下是解决思路:
-
全局更新:
apt-get update
-
解决代码:
apt-get install python3 python-dev python3-dev
,apt-get install build-essential libssl-dev libffi-dev
,apt-get install libxml2-dev libxslt1-dev zlib1g-dev
-
-
收集静态文件:
python manage.py collectstatic
-
数据库连接(docker ubuntu容器连接docker mysql容器)
-
查看容器IP:
docker inspect -f='{{.Name}} {{.NetworkSettings.IPAddress}} {{.HostConfig.PortBindings}}' $(docker ps -aq)
-
开发数据使用端口:
docker run -it -p 8000:80 -p 111:22 -p 336:3306 --name myubuntu -v /opt/myubuntu:/opt/myubuntu myubuntu-v1.02 /bin/bash
-
-
生成数据库:
python manage.py makemigrations
-
创建数据库文件:
python manage.py migrate
-
创建超级用户:
python manage.py createsuperuser
出错:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
-
解决方案:
-
查看编码格式:
locale -a
查看是否有utf8
-
查看编码环境:
python -c 'import locale; print(locale.getdefaultlocale())'
,python -c 'import locale; print(locale.getpreferredencoding())'
-
设置utf8:
export LANG="C.UTF-8"
-
-
修改超级用户密码:
python manage.py changepassword 用户
-
安装
pip install uwsgi
-
配置文件uwsgi文件(uwsgi.ini)
[uwsgi] # Django-related settings socket = 127.0.0.1:8000 # 项目绝对路径 chdir = /opt/myubuntu/hq_blog # Django的wsgi文件相对路径 wsgi-file = /opt/myubuntu/hq_blog/hq_blog/wsgi.py # process-related settings # master master = True # 最大进程数,一般为cpu的个数 processes = 4 # 线程数 threads = 2 #设置此参数,有一个主进程 master=True #主进程id写入文件里 pidfile= /var/log/nginx/uwsgi.pid # ... with appropriate permissions - may be needed chmod-socket = 664 #退出时,清理环境 vacuum = True reload-mercy = 10 max-requests = 5000 limit-as = 512 buffer-size = 30000 uid = 1000 gid = 2000
-
启动运行uwsgi
uwsgi --ini uwsgi.ini
-
重新启动uwsgi
uwsgi --reload uwsgi.pid
-
停止uwsgi
uwsgi --stop uwsgi.pid