目录
安装
配置国内加速
Docker容器三个主要概念:仓库、镜像和容器
简单流程
镜像
容器
常用镜像安装:mysql、nginx、redis
拉取镜像
创建目录和配置文件
启动容器
运行docker 容器Permission denied
安装
环境: Centos7
安装yum-utils
yum install -y yum-utils
查看是否已安装docker列表
yum list installed | grep docker
安装docker
yum -y install docker
-y表示不询问安装,直到安装成功,安装完后再次查看安装列表
- 启动docker systemctl start docker
- 查看docker服务状态 systemctl status docker
- 停止 systemctl stop docker
- 重启 systemctl restart docker
- 设置开机启动 systemctl enable docker.service
配置国内加速
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"live-restore": true
}
Docker容器三个主要概念:仓库、镜像和容器
- 镜像: 相当于程序安装包
- 容器: 安装好的程序
- (镜像的)仓库: 放安装包的仓库.
- 镜像
Docker镜像里包含了已打包的应用程序及其所依赖的环境。它包含应用程序可用的文件系统和其他元数据,如镜像运行时的可执行文件路径。 - 镜像仓库
Docker镜像仓库用于存放Docker镜像,以及促进不同人和不同电脑之间共享这些镜像。当编译镜像时,要么可以在编译它的电脑上运行,要么可以先上传镜像到一个镜像仓库,然后下载到另外一台电脑上并运行它。某些仓库是公开的,允许所有人从中拉取镜像,同时也有一些是私有的,仅部分人和机器可接入。 - 容器
Docker容器通常是一个Linux容器,它基于Docker镜像被创建。一个运行中的容器是一个运行在Docker主机上的进程,但它和主机,以及所有运行在主机上的其他进程都是隔离的。这个进程也是资源受限的,意味着它只能访问和使用分配给它的资源(CPU、内存等)。
简单流程
首先开发者在开发环境机器上开发应用并制作镜像。构建镜像并存储在机器上。然后将本地镜像上传到镜像仓库。生产环境机器收到运行镜像命令后,Docker会从镜像仓库拉取镜像到机器上,然后基于镜像运行容器。
镜像
- 查看镜像 docker images
- 搜索镜像 docker search 镜像名称
- 拉取镜像 docker pull 镜像名称:版本号
- 删除镜像 docker rmi 镜像名称:版本号
- 镜像信息 vi /var/lib/docker/image/devicemapper/repositories.json
容器
- 查看所有容器 docker ps -a
- 查看正在运行的容器 docker ps
- 启动容器 docker start 容器名称
- 停止容器 docker stop 容器名称
- 重启容器 docker restart nginx
- 当你使用Docker运行Nginx并挂载了配置文件,然后修改了这些挂载的配置文件后,仅仅重启Docker容器是不够的,Nginx服务本身也需要重新加载或重启。
- 如nginx:docker exec -it <container_name_or_id> nginx -s reload
- docker exec -it nginx nginx -s reload
- 删除容器 docker rm 容器名称
- 删除所有容器 docker rm `docker ps -aq`
- 查看容器详细信息 docker inspect 容器名称
- 容器文件位置 cd /var/lib/docker/containers/
- 创建容器(参数详解) docker run --name nginx -p 80:80 -d nginx
- 进入容器:docker exec -it nginx bash
- 容器内vi、vim失效:apt-get update apt-get install vim
- ps -aux|grep nginx失效: apt-get update && apt-get install procps
- 退出容器:exit
- 获取容器的日志: docker logs f813e52ce6ec650ca7fb9992a
- -f : 跟踪日志输出
- --since :显示某个开始时间的所有日志
- -t : 显示时间戳
- --tail :仅列出最新N条容器日志
常用镜像安装:mysql、nginx、redis
拉取镜像
docker pull nginx
docker pull redis
docker pull kdvolder/jdk8
docker pull mysql:5.7
创建目录和配置文件
cd /server/
mkdir jar
mkdir logs
mkdir file
/server/file目录下创建文件redis.conf,内容如下:
bind 0.0.0.0
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 0
loglevel notice
logfile ""
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
如果bind设置为 127.0.0.1,则只能本机访问
/server/file目录下创建文件nginx.conf,和conf.d目录,/server/www(放html文件)
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
conf.d目录下灵活放入多个nginx配置,/server/file/conf.d下创建default.conf
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/log/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
#autoindex on;
#try_files $uri /index/index/page.html;
#try_files $uri /index/map/page.html;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
启动容器
启动Mysql容器
docker run -p 3316:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
创建运行nginx容器
docker run --name nginx -p 80:80 -v /server/www:/usr/share/nginx/html \
-v /server/file/nginx.conf:/etc/nginx/nginx.conf \
-v /server/logs/nginx:/var/log/nginx \
-v /server/file/conf.d:/etc/nginx/conf.d -d nginx:latest
- \是换行的意思
- --name nginx 为容器指定一个名称
- -p: 指定端口映射,格式为:主机(宿主)端口:容器端口,可以使用多个-p做多个端口映射(-p 5000:23 -p 5001:22)
- -d: 后台运行容器,并返回容器ID;
- -v 将宿主机目录挂载到容器的目录,-v /宿主机目录:/容器目录
- /server/www目录上传一个测试html,访问:
创建运行redis容器
docker run --privileged=true -p 6378:6379 \
-v /server/file/redis.conf:/docker/redis/conf/redis.conf \
-v /server/file/redis_data:/docker/redis/data --name redis \
-d redis:latest redis-server /docker/redis/conf/redis.conf --appendonly yes --requirepass 'pwredis456'
- -d 后台运行容器,并返回容器ID;
- --privileged=true 容器内的root拥有真正root权限,否则容器内root只是外部普通用户权限
- -p 6378:6379 指定端口映射,格式:主机(宿主)端口:容器端口
- --name redis 指定一个名称
- redis:latest redis-server /docker/redis/conf/redis.conf 指定配置文件启动redis-server进程,latest镜像版本,docker images查看
- --appendonly yes 开启数据持久化
- --requirepass '123456’设置密码
常见问题
运行docker 容器Permission denied
因为linux为了系统安全性,会控制用户可以访问、读取、修改哪些文件,通过selinux限制了该文件得写入权限。
Selinux有3种选项,分别为:
- enforcing:强制模式,违反SELinux规则的行为将被阻止并记录到日志中。
- permissive:宽容模式,违反SELinux规则的行为只会记录到日志中,一般为调试用。
- disabled:关闭 SELinux。
临时关闭
- [root@localhost ~]# getenforce
- Enforcing
- [root@localhost ~]# setenforce 0
- [root@localhost ~]# getenforce
- Permissive
永久关闭:需重启服务器
- [root@localhost ~]# vim /etc/sysconfig/selinux
- SELINUX=enforcing 改为 SELINUX=disabled
运行docker 容器失败
刚启动就关闭的, 可docker logs (id)查看报错日志解决, 一般是配置文件写错了