***************************制作镜像常用命令:***************************
1、运行镜像 docker run -idt 镜像名:tag号 或 docker run -it 镜像名:tag号 /bin/bash
-i: 交互式操作
-d :指定容器的运行模式,让容器在后台运行。默认不会进入容器,想要进入容器需要使用docker exec
-t: 终端
/bin/bash:命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash
** 加端口映射: docker run -p 16800:5000 -idt 镜像名:tag号
(容器中的5000端口映射成宿主机的16800端口)
端口映射后,外部访问容器中服务地址:宿主机IP:16800
** 将宿主机文件挂载到容器中:
docker run -it -v /test:/soft 镜像名:tag号 /bin/bash
-v参数中,冒号":"前面的目录是宿主机目录,后面的目录是容器内目录
** 设置容器编码格式
docker run -it -e PYTHONIOENCODING=UTF-8 -v /test:/soft 镜像名:tag号 /bin/bash
-e参数设置shell的默认编码方式为 utf-8,在编译python代码的时候才不会报如下错误:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-12
** 以特权模式运行容器:
docker run -d --name pb --privileged=true 镜像名:id /usr/sbin/init
进入容器:
docker exec -it pb /bin/bash
以特权模式运行容器后,可以在容器内使用service等后台服务。
2、进入和退出容器
**进入容器**
docker exec -it 容器名或ID /bin/bash
docker attach --sig-proxy=false 容器名或ID //--sig-proxy=false可确保CTRL-D或CTRL-C不会关闭且stop容器
**退出容器:**
exit :容器停止退出,容器里的程序会中断,docker ps会查不到退出的容器
Ctrl+P+Q :容器不停止退出,容器里的程序还在跑,docker ps能查到退出的容器
注意: 用docker attach进容器时,若用exit会导致容器stop掉,必须用 Ctrl+P+Q
3、宿主机文件拷贝到容器 docker cp 宿主机项目文件存放目录 容器启动名或ID:容器中存放项目文件的目录
可直接在运行镜像时通过-v参数将宿主机文件挂载到容器。
容器文件拷贝到宿主机: docker cp 容器启动名或ID:容器中存放项目文件的目录 宿主机项目文件存放目录
4、将容器保存为新镜像 docker commit 容器启动名或ID 新镜像名:版本号
5、将新镜像打包成tar包(默认保存到当前路径) docker save -o ***.tar 镜像名:TAG
6、加载tar包 docker load -i xxx.tar
*************************其他常用命令:*************************
1、查看容器的资源使用情况 docker top container_id
docker inspect
2、删除镜像 docker rmi IMAGE ID
(如果镜像正在被某个容器使用,则会报错,这时只需先删除容器就好了)
3、删除容器 docker rm 容器启动名或ID
4、启动容器 docker start 容器启动名或ID
停止容器 docker stop 容器启动名或ID
5、更名 docker tag dl-4a:1.7.1 dl-4a:1.5.7
6、查看容器中进程信息:
在宿主机直接运行:docker exec 容器启动名或ID ps -ef
或者在容器中运行:jobs -l
停掉容器中进程:进入该容器,kill pid
7、查看容器中端口映射信息:docker container port 容器启动名或ID
结果:15500/tcp -> 0.0.0.0:15400,容器内port 15500映射成了宿主机port 15400
nvidia-docker
nvidia-docker介绍和使用:安装使用NVIDIA-Docker-- 可使用GPU的Docker容器
***起容器***
nvidia-docker run --name limin_ai -m 32G --memory-swap=-1 -it -v /sata01/AIhome_ext/limin_ai/:/code/ -v /sata01/AIhome_ext/liuxk/PSEnet/data2/:/code/invoice_project/PSEnet2/data/ tf_gpu:1.4 env LANG=C.UTF-8 /bin/bash
-v 可多次使用,挂载多个目录
-m :设置容器使用内存最大值;
核心概念理解
Docker的三大核心概念:镜像、容器、仓库
镜像:类似虚拟机的镜像、用俗话说就是安装文件。
容器:类似一个轻量级的沙箱,容器是从镜像创建应用运行实例,
可以将其启动、开始、停止、删除、而这些容器都是相互隔离、互不可见的。
仓库:类似代码仓库,是Docker集中存放镜像文件的场所。
Docker、Dockerfile、Docker镜像、容器这些都是什么鸟?
**Docker:**最早是dotCloud公司出品的一套容器管理工具,但后来Docker慢慢火起来了,连公司名字都从dotCloud改成Docker。
Dockerfile: 用于构建镜像,包含Docker镜像的描述文件,可以理解成火箭发射的A、B、C、D……的步骤。构建镜像时,每做完一个步骤,在Dockerfile中记录一条,这样Dockerfile也就做出来了。
Docker镜像: 通过Dockerfile做出来的,包含操作系统基础文件和软件运行环境,它使用分层的存储方式。
容器: 是运行起来的镜像,简单理解,Docker镜像相当于程序,容器相当于进程。
讲了这么多,大家可能已经意识到了,想玩转Docker必须先要搞定Docker镜像,镜像又来自于 Dockerfile。
docker安装–以centos7为例
前提条件
Docker 要求 Ubuntu 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的 Ubuntu 版本是否支持 Docker。可通过 uname -r 命令查看你当前的内核版本
$ uname -r
更新yum包:
$ sudo yum update
卸载旧版本(如果安装过旧版本的话)
$ sudo yum remove docker docker-common docker-selinux docker-engine
安装命令:
$ sudo yum install docker-ce-18.03.1.ce
启动并加入开机启动
$ sudo systemctl start docker
$ sudo systemctl enable docker
验证是否安装成功:docker info或docker version
[limin@aubin ~]$ docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 1
Server Version: 18.03.1-ce
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
用docker version命令,出现Client和Server信息,即表示安装成功。
[limin@aubin ~]$ docker version
Client:
Version: 18.03.1-ce
API version: 1.37
Go version: go1.9.5
Git commit: 9ee9f40
Built: Thu Apr 26 07:20:16 2018
OS/Arch: linux/amd64
Experimental: false
Orchestrator: swarm
Server:
Engine:
Version: 18.03.1-ce
API version: 1.37 (minimum version 1.12)
Go version: go1.9.5
Git commit: 9ee9f40
Built: Thu Apr 26 07:23:58 2018
OS/Arch: linux/amd64
Experimental: false
常见问题:
用docker info或docker version查看docker是否安装成功时,报如下错误:
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.37/version: dial unix /var/run/docker.sock: connect: permission denied
在执行命令前加上sudo即可。
若不想每次执行docker命令都加sudo ,可用如下方式:
sudo groupadd docker #添加docker用户组
sudo gpasswd -a $USER docker #将登陆用户加入到docker用户组中
newgrp docker #更新用户组
docker ps #测试docker命令是否可以使用sudo正常使用
二 常用命令
停掉docker服务:
service docker stop
查看镜像
docker images
查看所有的容器
docker ps -a
进入容器
docker attach 容器ID
docker exec -it 容器ID /bin/bash
退出容器
exit
镜像操作命令–以MySQL为例
1、拉取镜像:
docker pull mysql
docker pull python:3.6.5
2、查看下载的镜像
docker images
3、根据镜像创建容器
docker run --name mysqlserver -p 3308:3306 -e
参数解释:
–name 容器名字
-p 3308:3306 物理机端口:容器内部端口.匹配镜像内的网络端口号,即我们可以通过宿主机中访问3308端口来达到访问容器3306端口的目的。
-e 运行参数 初始化 root 用户的密码
-d 后台运行 mysql/mysql-server:5.5 下载的镜像名字加标签
-v ./conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。//配置文件目录
-v ./logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。//日志目录
-v ./data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。//数据库文件存放目录
上面这些参数都是可选的,可以不要。
4、查看某镜像的容器是否运行成功
docker ps |grep 镜像名
5、用docker exec进入容器内,然后用mysql -u root -p进入MySQL终端:
[li@aubin ~]$ docker exec -it 容器ID /bin/bash
root@6657671f5bd8:/# mysql -u root -p
6、修改mysql允许远程连接:
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
mysql>FLUSH PRIVILEGES;
然后我们可以通过本机连接容器内的数据库,(我们将容器内的3306端口映射到了本机的3308,所以我们通过3308端口访问)
mysql -u root -p -h 127.0.0.1 -P 3308
7、退出容器:
exit
或者
Ctrl+P+Q
8、重启容器
docker restart 容器ID
9、重启容器后进入交互式
docker start -i 5c6ce895b979
10、停止容器
docker stop mysqlserver
11、删除容器
docker rm mysqlserver
参考:使用Docker安装Mysql:https://www.cnblogs.com/loovelj/p/7823093.html
【Docker】退出容器和进入容器:https://www.cnblogs.com/defineconst/p/10035529.html
dockfile制作镜像命令:
请看我的另外一篇文章,写的很详细:
https://blog.csdn.net/u011208984/article/details/102756745