具体见ppt
我们之前做的许多项目如果要部署在别人电脑上,就要安装许多的库,环境部署,安装ngix等等,docker就可以处理这个问题,直接将做好的项目封装成一个容器,拿来用就可以了。
在计算机中,虚拟化(英文: Virtualization)是一种资源管理技术,是将计算机的各种实体资源(如: 服务器、网络、内存及存储等)予以抽象、转化后呈现出来,
Docker是一个开源的应用容器引擎, 诞生2013年,最初是dotCloud 公司内部的一个业余项目。它基于Google公司推出的Go语言实现。 项目后来加入Linux基金会,遵从了Apache2.0协议,源代码托管在 Github 进行维护。
- 上手快
用户只需要几分钟,就可以把自己的程序"Docker化"。
Docker依赖于"写时复制"(copy-onwrite)模型,使修改应用程序也非常迅速,可以说达到"随心所欲,代码即改"的境界。
随后,就可以创建容器来运行应用程序了。大多数Docker容器只需要不到1秒即可启动。由于去除了管理程序的开销,Docker容器拥有很高的性能,同时同一台宿主机中也可以运行更多的容器,使用户尽可能的充分利用系统资源。
- 职责的逻辑分类
使用Docker,开发人员只需要关心容器中优秀的应用程序,而运维人员只需要关心如何管理容器。**Docker设计的目的就是要加强开发人员写代码的开发环境与应用程序要部署的生产环境一致性。**从而降低那种"开发时一切正常,肯定时运维的问题(测试环境都是正常的, 上线后出了问题就归结为肯定是运维的问题)"。
- 快速高效的开发生命周期
Docker的目标之一就是缩短代码从开发、测试到部署、上线运行的周期,让你的应用程序具备可移植性,易于构建,并易于协作。(通俗一点说,Docker就像一个盒子,里面可以装很多物件,如果需要这些物件的可以直接将该大盒子拿走,而不需要从盒子里一件一件的取)。
- 鼓励使用面向服务的架构
Docker还鼓励面向服务的体系结构和微服务架构。Docker推荐单个容器只运行一个应用程序或者进程,这样就形成了一个分布式的应用程序模型,在这种模型下,应用程序或者服务都可以表示为一系列内部互联的容器。从而使分布式部署应用程序,扩展和调试应用程序都变得非常简单,同时也提高了程序的内省性。(当然,一个程序中可以运行多个应用程序)。
虚拟化方式,每个虚拟机都有一个自己的操作系统
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200501195016202.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU2ODYzMw==,size_16,color_FFFFFF,t_70
Docker是一个客户端/服务器(C/S)架构的程序。Docker客户端只需向Docker服务器或守护进程发出请求,服务器或守护进程将完成所有工作并返回结果。
仓库:每个仓库存放某一类镜像。
镜像:类似虚拟机镜像(eg:xxx.iso)。 eg: MySQL镜像、Redis镜像、2048镜像
容器:类似linux系统环境,运行和隔离应用。容器从镜像启动的时候,docker会在镜像的最上一层创建一个可写层,镜像本身是只读的,保持不变。
Docker用Registry来保存用户构建的镜像。Registry分为公有和私有两种。
1.打开git bash
连接阿里云服务器
设置服务器主机名
$ ssh [email protected]
[root@iz8vbijtqjs4nfugeph2m5z ~]# hostname docker #设置主机名为docker
[root@iz8vbijtqjs4nfugeph2m5z ~]# logout #退出重新进
$ ssh [email protected]
2.安装
yum install docker -y
3.docker一些操作指令
[root@docker ~]# docker -v
Docker version 1.13.1, build cccb291/1.13.1
[root@docker ~]# docker info
[root@docker ~]# systemctl start docker
[root@docker ~]# systemctl restart docker
[root@docker ~]# systemctl enable docker
编辑/etc/docker/daemon.json
文件,添加清华镜像
修改了配置文件,重启docker
[root@docker ~]# vim /etc/docker/daemon.json #编辑此文件添加清华镜像
[root@docker ~]# systemctl restart docker
镜像相关命令
docker images #查看镜像
docker search 2048(镜像名称) #搜索镜像
docker pull docker.io/blackicebird/2048 #从镜像仓库拉取镜像
docker rmi 镜像ID #删除镜像
docker rmi `docker images -q` #删除所有镜像(注意:``是反向单引号)
容器相关命令
1.查看容器
docker ps #查看所有正在运行的容器
docker ps -a #查看所有容器(无论是否运行)
docker ps -l #查看最后一次运行的容器
docker ps -f status=exited #查看停止的容器
2.创建容器
(1)交互式创建容器(不建议)
# 交互式创建容器,退出后直接关闭容器,再次进入容器需要先docker start * 开启容器
docker run -it --name=myubuntu ubuntu /bin/bash # 交互式创建容器, exit退出当前容器
退出:ctl +p+q退出时不会关闭容器
docker exec -it 容器名称/容器ID /bin/bash # 登录守护容器交互环境的方式
(2)守护式创建容器(建议)
docker run -d --name 2048 -p 0.0.0.0:81:80 docker.io/blackicebird/2048 #守护式创建容器
-d:后台运行;
--name:容器名字;
-p:将容器的80端口映射到本地的81端口,0.0.0.0:和81绑定的任何ip都可以访问;
容器的端口在哪里查找?在[Docker Hub](https://hub.docker.com/)官方文档里搜索2048,查找2048容器的端口。
docker.io/blackicebird/2048:拉去下来的镜像
3.关闭与启动容器
docker stop 容器名称(或者容器ID) #关闭容器
docker start 容器名称(或者容器ID) #启动容器
介绍:
我们呢只需要从镜像仓库中拉取2048的镜像到本地,运行创建容器,浏览器访问服务器IP,就可以玩游戏了。
也可以把我们自己写的项目封装成一个镜像,别人拉取下来创建容器就可以访问了。
操作如下:
1.查看docker镜像,发现没有镜像,
2.在仓库中进行搜索 ,出现很多相关镜像,选一个START高的,进行pull
[root@docker ~]# docker images #查看镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@docker ~]# docker search 2048 #搜索2048相关镜像
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/blackicebird/2048 2048 with logging 4
docker.io docker.io/isula/2048 1
3.从镜像仓库拉取镜像到本地
4.查看本地是否有此镜像
5.有,创建容器
https://hub.docker.com/
[root@docker ~]# docker pull docker.io/blackicebird/2048 #从镜像仓库拉取镜像
[root@docker ~]# docker images #查看
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/blackicebird/2048 latest 960672cda083 4 years ago 8.02 MB
[root@docker ~]# docker run -d --name 2048 -p 0.0.0.0:80:80 docker.io/blackicebird/2048 #创建容器
117b2cb17eaada303a13393455f88c6ffeb9053d7f5a522520f8847f7cc9223c
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
117b2cb17eaa docker.io/blackicebird/2048 "nginx -c /etc/ngi..." 2 minutes ago Up 2 minutes 0.0.0.0:80->80/tcp 2048
6.浏览器访问服务器IPhttp://39.101.175.120/
就可以直接玩游戏了
错误1:
执行创建容器命令:docker run -d --name 2048 -p 0.0.0.0:80:80 docker.io/blackicebird/2048
Error response from daemon: oci runtime error: container_linux.go:235: starting container process caused “process_linux.go:258: applying cgroup configuration for process caused “Cannot set property TasksAccounting, or unknown property.””.
原因:docker和操作系统版本不兼容的原因.
解决:1. 升级系统版本;2. 降低docker版本
具体操作:
错误2:
Error response from daemon: Conflict. The container name “/2048” is already in use by container 4ce3ef62e2ce4d2f8b5c9d7a0032b61281059ee3476b8434e971cf3513b3fd65. You have to remove (or rename) that container to be able to reuse that name…
原因:上一次运行出错后,已经创建了2048容器
解决:关闭容器,删掉容器
[root@docker ~]# docker ps -a #查看容器名称
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4ce3ef62e2ce docker.io/blackicebird/2048 "nginx -c /etc/ngi..." 37 minutes ago Created 2048
[root@docker ~]# docker stop 2048 #关闭容器
2048
[root@docker ~]# docker rm 2048 #删除容器
2048
[root@docker ~]# docker ps -a #再次查看
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
错误3.创建了容器成功后用浏览器无法访问
原因:1.防火墙没关;2.阿里云安全组80端口没有设置
docker cp 容器名称:容器目录 需要拷贝的文件或者目录 #把容器中的文件拷贝到本地
docker cp 需要拷贝的文件或者目录 容器名称:容器目录 #把本地的文件拷贝到容器
操作如下:
在镜像库中拉取一个ubuntu镜像,创建成一个容器,执行拷贝操作
实现:
把容器中的文件拷贝到本地
把本地的文件拷贝到容器
注意:拷贝欸操作在本地执行,不是容器
[root@docker ~]# docker search ubuntu
[root@docker ~]# docker pull docker.io/ubuntu
[root@docker ~]# docker run -it --name my_ubuntu docker.io/ubuntu /bin/bash #使用交互式创建容器
root@f807375c71f2:/# #进入ubuntu命令行
root@f807375c71f2:/# ls
bin dev home lib32 libx32 mnt proc run srv tmp var
boot etc lib lib64 media opt root sbin sys usr
root@f807375c71f2:/# hostname > hostname.txt #在容器里创建一个hostname.txt文件
root@f807375c71f2:/# cat hostname.txt #查看文件
f807375c71f2
root@f807375c71f2:/# [root@docker ~]# #ctl+p+q退出,在本地执行拷贝操作
[root@docker ~]# docker cp f807375c71f2:/hostname.txt /mnt/ #将容器里的txt文件拷贝到本地/mnt/
[root@docker ~]# cat /mnt/hostname.txt #查看
f807375c71f2
[root@docker ~]# docker cp /etc/passwd f807375c71f2:/tmp/ #将本地/etc/passwd文件拷贝到容器里
[root@docker ~]# docker exec -it my_ubuntu /bin/bash #进入交互式命令行
root@f807375c71f2:/# head -3 /tmp/passwd #查看拷贝文件的前三行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
root@f807375c71f2:/#
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主主机某个目录的文件从而影响容器。
[root@docker ~]# docker run -di -v /usr/share/Pro:/usr/share/project1 --name ubuntu_dir_mapping docker.io/ubuntu
-di:进入后台交互式
-v:把容器的/usr/share/project1映射到本地主机 /usr/share/Pro
--name:映射名为ubuntu_dir_mapping
docker.io/ubuntu:对这个镜像进行映射
操作:
对docker.io/ubuntu镜像的/usr/share/project1
目录映射到本地/usr/share/Project1
目录,在容器里/usr/share/project1目录中创建文件,在本地/usr/share/Project1目录查看是否自动执行创建文件。
在真机上删除文件,进入容器里面查看是否删除。
[root@docker ~]# docker images #查看镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/ubuntu latest 1d622ef86b13 7 days ago 73.9 MB
docker.io/blackicebird/2048 latest 960672cda083 4 years ago 8.02 MB
[root@docker ~]# docker run -di -v /usr/share/Project1:/usr/share/project1 --name ubuntu_dir_mapping docker.io/ubuntu #对docker.io/ubuntu镜像做映射
7607bc5c73238e7869daae497675f14e4db4ff6960ba4435dbf2010a744e9268
[root@docker ~]#
[root@docker ~]# docker exec -it ubuntu_dir_mapping /bin/bash #交互式进行操作
root@7607bc5c7323:/# cd /usr/share/project1/
root@7607bc5c7323:/usr/share/project1# ls
root@7607bc5c7323:/usr/share/project1# touch file{1..10} #在容器中这个目录创建文件
root@7607bc5c7323:/usr/share/project1# ls
file1 file10 file2 file3 file4 file5 file6 file7 file8 file9
root@7607bc5c7323:/usr/share/project1#
root@7607bc5c7323:/usr/share/project1# touch file{1..10}[root@docker ~]# #ctl+p+q退出容器
[root@docker ~]#
[root@docker ~]# ls /usr/share/Project1/ #在本地查看刚才在容器中的操作是否自动在本地也执行
file1 file10 file2 file3 file4 file5 file6 file7 file8 file9
[root@docker ~]#
[root@docker ~]# rm -fr /usr/share/Project1/file{2..8} #在本地删除文件
[root@docker ~]# ls /usr/share/Project1/
file1 file10 file9
[root@docker ~]# docker exec -it ubuntu_dir_mapping /bin/bash #进入容器中查看文件是否删除
root@7607bc5c7323:/# ls /usr/share/project1
file1 file10 file9
root@7607bc5c7323:/#
docker inspect my_ubuntu(容器的名称) #令查看容器运行的各种数据
docker inspect --format='{
{.NetworkSettings.IPAddress}}' my_ubuntu #直接查my_ubuntu容器的IP
1.拉取mysql镜像
[root@docker ~]# docker search mysql
[root@docker ~]# docker pull docker.io/mysql
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/mysql latest a7a67c95e831 3 days ago 541 MB
docker.io/ubuntu latest 1d622ef86b13 7 days ago 73.9 MB
docker.io/blackicebird/2048 latest 960672cda083 4 years ago 8.02 MB
问题:在镜像仓库中拉取mysql时,非常慢,
解决:在配置文件中加清华镜像源
[root@docker ~]# vim /etc/docker/daemon.json #编辑此文件添加清华镜像
[root@docker ~]# systemctl restart docker
2.创建mysql容器
[root@docker ~]# docker run -id --name mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD='daliu' mysql #运行时必须加-e编辑密码,否则不能运行
0ee929884b59da2195349a54db867b10fe394ec49acc0d69a1a359d9be335f53
[root@docker ~]# docker inspect --format='{
{.NetworkSettings.IPAddress}}' mysql #查询mysqlIP
172.17.0.2
[root@docker ~]#
-p 代表端口映射,格式为 宿主机映射端口:容器运行端口。
-e 代表添加环境变量 MYSQL_ROOT_PASSWORD是root用户的登录密码。此参数可以在Docker Hub官网查。
3.进入MySQL容器并登录MySQL
[root@docker ~]# docker ps #查容器名
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0ee929884b59 mysql "docker-entrypoint..." 4 minutes ago Up 4 minutes 33060/tcp, 0.0.0.0:3307->3306/tcp mysql
[root@docker ~]# docker exec -it mysql /bin/bash #运行容器进入交互环境
root@0ee929884b59:/# mysql -uroot -pdaliu #在容器中中登陆mysql
mysql> create user daliu@'%' identified by 'daliu'; #创建daliu用户
Query OK, 0 rows affected (0.00 sec)
mysql> grant all privileges on *.* to 'daliu'@'%'; #授权
Query OK, 0 rows affected (0.01 sec)
mysql> ALTER USER 'daliu'@'%' IDENTIFIED WITH mysql_native_password BY 'daliu'; #修改账户密码加密规则并更新用户密码。因为容器和本地mysql的版本不一样,密码加密规则不一样。
root@0ee929884b59:/# mysql -udaliu -pdaliu #以daliu用户进入mysql,可以登陆
mysql>
[2]+ Stopped mysql -udaliu -pdaliu
root@0ee929884b59:/# [root@docker ~]# #退出容器
[root@docker ~]# mysql -udaliu -pdaliu -h172.17.0.2 #退出容器在本地在次登陆,可以登陆
MySQL [(none)]>
[1]+ Stopped mysql -udaliu -pdaliu -h172.17.0.2
问题1:在本地输入mysql时,显示没有此命令,说明本地没有安装mysql
解决:安装mysql
[root@todolist-server ~]# yum install mariadb-server -y
[root@todolist-server ~]# systemctl start mariadb
[root@todolist-server ~]# systemctl enable mariadb
[root@todolist-server ~]# mysql_secure_installation #初始化修改密码
问题2:在本地以daliiu用户登陆,不能登陆
[root@docker ~]# mysql -udaliu -pdaliu -h172.17.0.2
ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib64/mysql/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory
原因:
容器中的mysql和本地的版本不一样
mysql8 之前的版本中加密规则是 mysql_native_password
而在mysql8之后,加密规则是 caching_sha2_password
解决: 进入容器,登陆mysql,修改账户密码加密规则并更新用户密码
[root@docker ~]# docker exec -it mysql /bin/bash
root@0ee929884b59:/# mysql -uroot -pdaliu
mysql> ALTER USER 'daliu'@'%' IDENTIFIED WITH mysql_native_password BY 'daliu';
root@0ee929884b59:/# [root@docker ~]#
[root@docker ~]# mysql -udaliu -pdaliu -h172.17.0.2 #退出容器在本地在次登陆,可以登陆
MySQL [(none)]>
[1]+ Stopped mysql -udaliu -pdaliu -h172.17.0.2
docker commit mysql(容器名) mysql:remove_login(镜像名)
练习:
我们刚才给mysql创建了一个用户,并授权,可以远程登陆。
下载我们可以把这个容器封装起来,做成镜像,别人就可以拉取到本地,然后可以直接远程连接,不用在部署了。
[root@docker ~]# docker commit mysql mysql:remove_login #将容器保存为本地镜像
sha256:0b265070d49553532427adad4dc96e3de47c5a8a92641f93f64c6ae9f0be0176
[root@docker ~]# docker images #查看镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql remove_login 0b265070d495 24 seconds ago 541 MB
docker.io/mysql latest a7a67c95e831 3 days ago 541 MB
docker.io/ubuntu latest 1d622ef86b13 7 days ago 73.9 MB
docker.io/blackicebird/2048 latest 960672cda083 4 years ago 8.02 MB
[root@docker ~]# docker run -d --name mysql_test -p 3308:3306 mysql:remove_login #运行本地镜像创建容器
b9c1bd39dc67ee6233338e96e559d04324a3a23b7f12bc023691b5a4dbf8be3f
[root@docker ~]# docker inspect --format='{
{.NetworkSettings.IPAddress}}' mysql #查看容器IP
172.17.0.2
[root@docker ~]# mysql -udaliu -pdaliu -h172.17.0.2 #这是我们刚才配置好的以daliu用户远程登陆,登陆成功
MySQL [(none)]>
将镜像保存为tar文件
docker save -o remote_mysql.tar mysql:remove_login
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql remove_login 0b265070d495 About an hour ago 541 MB
docker.io/mysql latest a7a67c95e831 3 days ago 541 MB
docker.io/ubuntu latest 1d622ef86b13 7 days ago 73.9 MB
docker.io/blackicebird/2048 latest 960672cda083 4 years ago 8.02 MB
[root@docker ~]# docker save -o remote_mysql.tar mysql:remove_login
docker load -i remote_mysql.tar
操作:
为了看到效果,先删除原来的镜像mysql:remove_login,然后加载压缩包,并查看镜像目录
[root@docker ~]# docker ps -a #查看容器ID
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b9c1bd39dc67 mysql:remove_login "docker-entrypoint..." About an hour ago Up About an hour 33060/tcp, 0.0.0.0:3308->3306/tcp mysql_test
0ee929884b59 mysql "docker-entrypoint..." 3 hours ago Up 3 hours 33060/tcp, 0.0.0.0:3307->3306/tcp mysql
7607bc5c7323 docker.io/ubuntu "/bin/bash" 4 hours ago Exited (137) 3 hours ago ubuntu_dir_mapping
f807375c71f2 docker.io/ubuntu "/bin/bash" 5 hours ago Exited (0) 3 hours ago my_ubuntu
79633145c2f2 docker.io/blackicebird/2048 "nginx -c /etc/ngi..." 6 hours ago Exited (0) 3 hours ago 2048
[root@docker ~]# docker stop b9c1bd39dc67 #关闭容器
b9c1bd39dc67
[root@docker ~]# docker rm b9c1bd39dc67 #删除容器
b9c1bd39dc67
[root@docker ~]# docker images #查看镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql remove_login 0b265070d495 About an hour ago 541 MB
docker.io/mysql latest a7a67c95e831 3 days ago 541 MB
docker.io/ubuntu latest 1d622ef86b13 7 days ago 73.9 MB
docker.io/blackicebird/2048 latest 960672cda083 4 years ago 8.02 MB
[root@docker ~]# docker rmi 0b265070d495 #删除镜像
Untagged: mysql:remove_login
Deleted: sha256:0b265070d49553532427adad4dc96e3de47c5a8a92641f93f64c6ae9f0be0176
Deleted: sha256:ae4661c67a7ad557a93e1a6ca077473e0595727d874816cd324564e1a3d9c87c
[root@docker ~]# docker images #查看镜像,已删除
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/mysql latest a7a67c95e831 3 days ago 541 MB
docker.io/ubuntu latest 1d622ef86b13 7 days ago 73.9 MB
docker.io/blackicebird/2048 latest 960672cda083 4 years ago 8.02 MB
[root@docker ~]# docker load -i remote_mysql.tar #加载压缩包
cd03e2e62c56: Loading layer 6.656 kB/6.656 kB
Loaded image: mysql:remove_login
[root@docker ~]# docker images #查看镜像,remove_login 被成功加载
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql remove_login 0b265070d495 About an hour ago 541 MB
docker.io/mysql latest a7a67c95e831 3 days ago 541 MB
docker.io/ubuntu latest 1d622ef86b13 7 days ago 73.9 MB
docker.io/blackicebird/2048 latest 960672cda083 4 years ago 8.02 MB
[root@docker ~]#
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。
对于开发人员:可以为开发团队提供一个完全一致的开发环境。
对于测试人员: 可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了。
对于运维人员: 在部署时,可以实现应用的无缝移植。
[root@docker ~]# vim docker_file #写一个docker_file文件
[root@docker ~]# mkdir dockertest #创建一个总目录,dockerfile和所有的文件都在这个目录中
[root@docker ~]# mv docker_file dockertest/dockerfile #将docker_file的内容移动到dockerfile里,顺便建立dockerfile文件
[root@docker ~]# cd dockertest/
[root@docker dockertest]# ls
dockerfile
[root@docker dockertest]# touch hello.txt #建一个hello.txt文件,练习将当前文件拷贝到容器里
[root@docker dockertest]# vim hello.txt
[root@docker dockertest]#
[root@docker dockertest]# docker build --no-cache -t ubuntu:test . #加载dockerfile文件
dockerfile文件
FROM docker.io/ubuntu #来自哪个基本镜像
MAINTAINER daliu #作者
RUN hostname > /mut/hostname.txt #运行:将容器的主机名重定向到/mut/hostname.txt
RUN cp /etc/passwd /mnt/passwd #运行:拷贝容器/etc/passwd到/mnt/passwd
COPY hello.txt /mnt/hello.txt #拷贝:当前目录hello.txt到容器/mnt/hello.txt
ENV username daliu
ENV password daliu
EXPOSE 80
CMD /bin/basg